在C#中,我们现在可以使用花括号构造函数构造新对象,即
class Person {
readonly string FirstName {get; set;}
readonly string LastName {get; set;}
}
new Person { FirstName = "Bob", LastName = "smith" }
我需要使用反射构造这个对象,但是如果这些成员变量被标记为只读,我只能在构造函数中设置它们,并且只有花括号构造函数可用。有什么方法可以使用反射访问花括号样式的构造函数?感谢。
答案 0 :(得分:24)
首先,使用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" }
示例相同的方式对其进行初始化:
Type.GetConstructor
)并将其命名为或使用Activator.CreateInstance
来实例化类型,FirstName
属性(请参阅Type.GetProperty
),PropertyInfo.SetValue
),LastName
重复(2)和(3)。答案 1 :(得分:4)
这与构造函数无关。 这只是用于初始化普通属性的简短语法。
new Person { FirstName = "Bob", LastName = "smith" };
与
完全相同var person = new Person();
person.FirstName = "Bob";
person.LastName = "smith";
正如人们所说。你的例子不会编译。因为它不是构造函数。
答案 2 :(得分:1)
你怎么编译这个? C#报告错误:
error CS0106: The modifier 'readonly' is not valid for this item
答案 3 :(得分:0)
我猜你的意思是私有的poperty setter而不是readonly属性(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);