在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" }
示例相同的方式初始化它,您必须:
- 检索构造函数(请参阅
Type.GetConstructor
)并调用它或使用Activator.CreateInstance
来实例化该类型, - 检索
FirstName
属性(请参阅Type.GetProperty
), - 设置它(参见
PropertyInfo.SetValue
), - 对
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性地设置属性:
上述就是C#学习教程:在C#中,如何使用reflection访问花括号构造函数?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
Type personType= typeof(Person); object personInstance = Activator.CreateInstance(personType); personInstance.GetProperty("FirstName").SetValue(classObject, "Bob, null); personInstance.GetProperty("LastName").SetValue(classObject, "smith, null);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1023909.html