nga*_*nju 4 c# reflection constructor
在C#中,我们现在可以使用花括号构造函数构造新对象,即
class Person {
readonly string FirstName {get; set;}
readonly string LastName {get; set;}
}
new Person { FirstName = "Bob", LastName = "smith" }
Run Code Online (Sandbox Code Playgroud)
我需要使用反射构造这个对象,但如果这些成员变量被标记为只读,我只能在构造函数中设置它们,并且只有花括号构造函数可用.有什么方法可以使用反射访问花括号样式的构造函数?谢谢.
Ond*_*cny 24
首先,不能使用readonly关键字将属性标记为只读.他们只能使用非公开的setter方法.
其次,没有"花括号构造函数"这样的东西.对于像这样的一组语句,它只是一个语法糖(快捷方式):
Person p = new Person(); // standard parameterless constructor is called
p.FirstName = "Bob";
p.LastName = "Smith";
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以使用带参数的构造函数:
new Person(1, 2, 3) { FirstName = "Bob", LastName = "Smith" }
Run Code Online (Sandbox Code Playgroud)
被翻译为:
Person p = new Person(1, 2, 3);
p.FirstName = "Bob";
p.LastName = "Smith";
Run Code Online (Sandbox Code Playgroud)
关于反射:要构造一个新实例并以与new Person { FirstName = "Bob", LastName = "Smith" }示例中相同的方式对其进行初始化,您必须:
Type.GetConstructor)并调用它或用于Activator.CreateInstance实例化类型,FirstName属性(请参阅Type.GetProperty),PropertyInfo.SetValue),LastName.这与构造函数无关。这只是用于初始化普通属性的简略语法。
new Person { FirstName = "Bob", LastName = "smith" };
Run Code Online (Sandbox Code Playgroud)
完全一样
var person = new Person();
person.FirstName = "Bob";
person.LastName = "smith";
Run Code Online (Sandbox Code Playgroud)
正如人们所说。你的例子不会编译。因为它不是构造函数。