【问题标题】:In C#, how to access curly brace constructor using reflection?在 C# 中,如何使用反射访问花括号构造函数?
【发布时间】:2011-02-28 19:26:06
【问题描述】:

在 C# 中,我们现在可以使用花括号构造函数构造新对象,即

class Person {
   readonly string FirstName {get; set;}
   readonly string LastName {get; set;}
}

new Person { FirstName = "Bob", LastName = "smith" }

我需要使用反射来构造这个对象,但是如果这些成员变量被标记为只读,我只能在构造函数中设置它们,并且只有花括号构造函数可用。有什么方法可以使用反射访问花括号样式的构造函数吗?谢谢。

【问题讨论】:

  • 我什至不确定您的示例中的语法是否正确,一个只读属性?
  • @Pharabus 更像是一个带有 setter 的只读属性!哈哈哈哈!!

标签: c# reflection constructor


【解决方案1】:

首先,属性不能用readonly 关键字标记为只读。它们只能有非公共的 setter 方法*)

其次,没有“花括号构造函数”之类的东西。这只是一组这样的语句的syntactic sugar(快捷方式):

Person p = new Person();  // standard parameterless constructor is called
p.FirstName = "Bob";
p.LastName = "Smith";

请注意,您也可以使用带参数的构造函数:

new Person(1, 2, 3) { FirstName = "Bob", LastName = "Smith" }

翻译为:

Person p = new Person(1, 2, 3);
p.FirstName = "Bob";
p.LastName = "Smith";

关于反射:要构造一个新实例并以与new Person { FirstName = "Bob", LastName = "Smith" } 示例相同的方式对其进行初始化,您必须:

  1. 检索构造函数(参见Type.GetConstructor)并调用它使用Activator.CreateInstance 实例化类型,
  2. 检索FirstName 属性(参见Type.GetProperty),
  3. 设置它(见PropertyInfo.SetValue),
  4. LastName 重复 (2) 和 (3)。

*) 更新:C# 9 will (as of May 2020) 引入了仅初始化属性,这将等同于 readonly 字段,仅允许在对象初始化期间(即在构造函数或对象初始化程序中)进行属性分配。

【讨论】:

    【解决方案2】:

    这与构造函数无关。 这只是初始化普通属性的简写语法。

    new Person { FirstName = "Bob", LastName = "smith" };
    

    完全一样

    var person = new Person();
    person.FirstName = "Bob";
    person.LastName = "smith";
    

    正如人们所说。你的例子不会编译。因为它不是构造函数。

    【讨论】:

      【解决方案3】:

      你怎么编译这个? C#报错:

      error CS0106: The modifier 'readonly' is not valid for this item
      

      【讨论】:

        【解决方案4】:

        我猜你的意思是私有的属性设置器而不是只读属性(get 和 set 是完整的 getter 和 setter 的简写)。然后你将不得不做这样的事情来反射设置属性:

        Type personType= typeof(Person);
        object personInstance = Activator.CreateInstance(personType);
        personInstance.GetProperty("FirstName").SetValue(classObject, "Bob, null);
        personInstance.GetProperty("LastName").SetValue(classObject, "smith, null);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          相关资源
          最近更新 更多