我想要的是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)
答案 0 :(得分: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{}
}
}
}
}
这个概念很简单。使用Object初始化程序创建动态类,然后通过某种方法为实例指定属性。
答案 1 :(得分:0)
正如一些人所指出的,已经存在类似的构造,但在VisualBasic(VB With)中。目前,C#中没有相应的声明。我们最近看到一些非常有用的东西添加到C#中,比如auto-property initializer,elvis operator等所以我希望将来会添加instance-initializer。