gpt4 book ai didi

c# - 在 C# 中,如何使用反射访问花括号构造函数?

转载 作者:太空狗 更新时间:2023-10-29 23:54:26 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

首先,不能使用readonly 关键字将属性标记为只读。它们只能有非公共(public)的 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)引入 init-only 属性,这将等同于 readonly 字段,允许仅在对象初始化期间(即在构造函数或对象初始化程序中)进行属性分配。

关于c# - 在 C# 中,如何使用反射访问花括号构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com