在C#中,如何使用reflection访问花括号构造函数?

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

class Person { readonly string FirstName {get; set;} readonly string LastName {get; set;} } new Person { FirstName = "Bob", LastName = "smith" } 

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

首先,不能使用readonly关键字将属性标记为readonly 。 他们只能使用非公开的setter方法。

其次,没有“花括号构造函数”这样的东西。 对于像这样的一组语句,它只是一个语法糖 (快捷方式):

 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"; 

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

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

这与构造函数无关。 这只是用于初始化常规属性的简写语法。

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

与…完全相同

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

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

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

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

我猜你的意思是私有的poperty setter而不是readonly属性(get和set是完整getter和setter的简写)。 然后你必须做这样的事情来reflection性地设置属性:

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