以与对象初始值设定项相同的方式设置实例的属性
Setting properties of an instance the same way as object initializer
我想要的是 object initializer,但对于已创建的对象实例。像这样:
MyClass myObj = MyClass.NewObj();
//...
myObj { prop1 = val1, prop2 = val2, ... prop50 = val50 };
这样写会好很多:
myObj.prop1 = val1;
myObj.prop2 = val2;
//...
myObj.prop50 = val50;
因为你会得到一个剩余属性的列表(而且只有属性!)还没有被赋值(就像对象初始值设定项一样)。
目前是否有允许这样做的语法结构? (C# 6.0)
我认为您正在寻找类似 VB 中的 with
运算符的内容。答案是不。 C#中没有这样的东西。如果您确实需要并且同意使用动态对象,您可以编写一些变通方法。检查下面的例子:
public class Program
{
public static void Main(string[] args)
{
//Your code goes here
Console.WriteLine("First:");
MyClass c = new MyClass();
c.Set(new {Property1="1", Property2="2", Property4="4"});
Console.WriteLine(c);
Console.WriteLine("Second:");
c.SetWithReflection(new {Property1="11",Property2="22", Property4="44"});
Console.WriteLine(c);
}
}
public class MyClass{
public void Set(dynamic d){
try{ Property1=d.Property1;}catch{}
try{ Property2=d.Property2;}catch{}
try{ Property3=d.Property3;}catch{}
}
public string Property1{get;set;}
public string Property2{get;set;}
public string Property3{get;set;}
public override string ToString(){
return string.Format(@"Property1: {0}
Property2: {1}
Property3: {2}", Property1,Property2,Property3);
}
}
public static class Extensions{
public static void SetWithReflection<T>(this T owner, dynamic d){
var dynamicProps = d.GetType().GetProperties();
foreach(PropertyInfo p in dynamicProps){
var prop = typeof(T).GetProperty(p.Name);
if(prop!=null){
try{ prop.SetValue(owner, p.GetValue(d)); } catch{}
}
}
}
}
这个概念很简单。使用对象初始值设定项创建动态 class,然后通过某种方法将属性分配给您的实例。
正如一些人所指出的,已经存在类似的构造,但是在 VisualBasic 中 (VB With)。目前,C# 中没有等效语句。我们最近看到一些非常有用的东西被添加到 C# 中,比如 auto-属性 初始化器、elvis 运算符等。所以我希望将来会添加实例初始化器。
我想要的是 object initializer,但对于已创建的对象实例。像这样:
MyClass myObj = MyClass.NewObj();
//...
myObj { prop1 = val1, prop2 = val2, ... prop50 = val50 };
这样写会好很多:
myObj.prop1 = val1;
myObj.prop2 = val2;
//...
myObj.prop50 = val50;
因为你会得到一个剩余属性的列表(而且只有属性!)还没有被赋值(就像对象初始值设定项一样)。 目前是否有允许这样做的语法结构? (C# 6.0)
我认为您正在寻找类似 VB 中的 with
运算符的内容。答案是不。 C#中没有这样的东西。如果您确实需要并且同意使用动态对象,您可以编写一些变通方法。检查下面的例子:
public class Program
{
public static void Main(string[] args)
{
//Your code goes here
Console.WriteLine("First:");
MyClass c = new MyClass();
c.Set(new {Property1="1", Property2="2", Property4="4"});
Console.WriteLine(c);
Console.WriteLine("Second:");
c.SetWithReflection(new {Property1="11",Property2="22", Property4="44"});
Console.WriteLine(c);
}
}
public class MyClass{
public void Set(dynamic d){
try{ Property1=d.Property1;}catch{}
try{ Property2=d.Property2;}catch{}
try{ Property3=d.Property3;}catch{}
}
public string Property1{get;set;}
public string Property2{get;set;}
public string Property3{get;set;}
public override string ToString(){
return string.Format(@"Property1: {0}
Property2: {1}
Property3: {2}", Property1,Property2,Property3);
}
}
public static class Extensions{
public static void SetWithReflection<T>(this T owner, dynamic d){
var dynamicProps = d.GetType().GetProperties();
foreach(PropertyInfo p in dynamicProps){
var prop = typeof(T).GetProperty(p.Name);
if(prop!=null){
try{ prop.SetValue(owner, p.GetValue(d)); } catch{}
}
}
}
}
这个概念很简单。使用对象初始值设定项创建动态 class,然后通过某种方法将属性分配给您的实例。
正如一些人所指出的,已经存在类似的构造,但是在 VisualBasic 中 (VB With)。目前,C# 中没有等效语句。我们最近看到一些非常有用的东西被添加到 C# 中,比如 auto-属性 初始化器、elvis 运算符等。所以我希望将来会添加实例初始化器。