以与对象初始值设定项相同的方式设置实例的属性

时间:2017-07-25 12:14:12

标签: c# properties 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)

2 个答案:

答案 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。