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

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 运算符等。所以我希望将来会添加实例初始化器。