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 年,我认为......)做一些其他事情来缩短我们的 new
ing:
var myList = new List<MyProperties>
{
new () {
Property1 = myStrongTypedClass.AccountNumber,
Property2 = myStringTypedClass.DoubleList
},
...
}
编译器知道它右边是一个List<MyProperties>
,所以左边就不用说了,右边的类型后面也不需要放()
并且您不需要在项目初始值设定项中说 MyProperties
,但是您 做 需要使用 new()
所以 C# 知道您正在尝试创建 MyProperties
而不是匿名类型
现在是 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 年,我认为......)做一些其他事情来缩短我们的 new
ing:
var myList = new List<MyProperties>
{
new () {
Property1 = myStrongTypedClass.AccountNumber,
Property2 = myStringTypedClass.DoubleList
},
...
}
编译器知道它右边是一个List<MyProperties>
,所以左边就不用说了,右边的类型后面也不需要放()
并且您不需要在项目初始值设定项中说 MyProperties
,但是您 做 需要使用 new()
所以 C# 知道您正在尝试创建 MyProperties
而不是匿名类型