C# 可以根据已知类型自动生成属性吗?

C# Possible to auto generate properties based on the known type?

现在是 2022 年。必须有办法做到这一点。假设我有一个空的 class 对象调用 MyProperties。我在语句的右侧有一个当前的强类型变量。 VS 是否有可能看到这一点并且 属性 不存在并根据语句右侧的强类型自动创建 属性?

private class MyProperties 
{
// We are empty so far

}


private void Main()
{
  List<MyProperties> myList = new List<MyProperties>
   {
     Property1 = myStrongTypedClass.AccountNumber,
     Property2 = myStringTypedClass.DoubleList
   // I want it to see that Property 1 or 2 doesn't exist but auto create them based on 
   // the type of AccountNumber and DoubleList.
   }

}

private MyStrongTypedClass

{
  public int AccountNumber {get; set;}
  public decimal Price {get; set;}
  public List<double> DoubleList {get; set}
}

编译器不会抱怨 MyProperties 不包含 AccountNumber 的定义,而是会自动创建它

是的,就当它存在一样写吧:

var mp = new MyProperties;

mp.Hello = "Something";

单击带有波浪线的 Hello,等待 lightbulb/spanner 按钮出现在附近,或单击空白处的 lightbulb/spanner

根据需要选择“生成字段”或“生成 属性”...

请注意,在您在问题中提出的示例中,它将不起作用

List<MyProperties> myList = new List<MyProperties>
{
    Property1 = myStrongTypedClass.AccountNumber,
    Property2 = myStringTypedClass.DoubleList
    // I want it to see that Property 1 or 2 doesn't exist but auto create them based on 
    // the type of AccountNumber and DoubleList.
}

您所写的是一个试图设置列表属性的对象初始值设定项,而不是试图将 MyProperties 项添加到列表的列表项初始值设定项。 尝试设置 List<T> 的不存在的 Property1 会给你一个“不包含定义”的错误,但不会添加它的选项,因为 List 不是你的 class.

您的代码需要如下所示:

List<MyProperties> myList = new List<MyProperties>
{
    new MyProperties() {
        Property1 = myStrongTypedClass.AccountNumber,
        Property2 = myStringTypedClass.DoubleList
    },
    ...
}

这是一个微妙但重要的区别

最后,我们可以在 2022 年(甚至 2017 年,我认为......)做一些其他事情来缩短我们的 newing:

var myList = new List<MyProperties>
{
    new () {
        Property1 = myStrongTypedClass.AccountNumber,
        Property2 = myStringTypedClass.DoubleList
    },
    ...
} 

编译器知道它右边是一个List<MyProperties>,所以左边就不用说了,右边的类型后面也不需要放()并且您不需要在项目初始值设定项中说 MyProperties,但是您 需要使用 new() 所以 C# 知道您正在尝试创建 MyProperties 而不是匿名类型