C# 初始化泛型类型对象时是否设置只读变量?
我有以下内容:基类SystemBody(它有3个只读字段,必须在构造函数中设置,并且在对象的生存期内永远不会更改)、来自SystemBody的任意派生类以及以下通用方法:C# 初始化泛型类型对象时是否设置只读变量?,c#,generics,constructor,polymorphism,initializer,C#,Generics,Constructor,Polymorphism,Initializer,我有以下内容:基类SystemBody(它有3个只读字段,必须在构造函数中设置,并且在对象的生存期内永远不会更改)、来自SystemBody的任意派生类以及以下通用方法: public T AddBody<T>(SystemBody parentBody) where T : SystemBody, new() { T rtn = new T(this, ++currentID, parentBody != null ? parentBody.id : -1); 我正在努力
public T AddBody<T>(SystemBody parentBody) where T : SystemBody, new()
{
T rtn = new T(this, ++currentID, parentBody != null ? parentBody.id : -1);
我正在努力理解在这种情况下我打算做什么
SystemBody有一个具有所需签名的构造函数,但我无法强制T中存在一个具有该签名的构造函数。(C#似乎明显缺少一个具有任何参数的构造函数的泛型类型约束)
我不能使用初始值设定项(如果属性是公共的,它会像预期的那样工作),因为它们是只读的。(初始值设定者将是我的首选)
使用public int-id{get;private set;}
与public readonly int-id代码>
我能想到的唯一解决方案是在基类中添加一个Initialize
方法,该方法接受我需要设置的参数——这感觉像是一个严重的黑客行为,它不符合C#code的编写方式
我错过了什么?我只需要从文档中写入初始化吗?:
其中T:new()
构造函数。与其他约束一起使用时,新的()
必须最后指定约束。无法创建新的()约束
结合结构和非托管约束
所以基本上你不能
您需要将属性更改为非
只读
:
new T() { SomeProperty = blah}
或使用:
(T)Activator.CreateInstance(typeof(T), args)
或者使用
Func
对其进行初始化。此问题的常见设计模式是和,如果您限制T:SystemBody
,您认为您可以简单地构造一个新的SystemBody
?因为对T的限制已经很窄了。即使它可以工作,对于一个从SystemBody
派生的类,如果它的构造函数稍有不同,你会怎么办?我处理这个问题的方法是定义一个字典
,然后将T
可以与Func
一起使用的所有类型都放在那里,以创建你的实例。
(T)Activator.CreateInstance(typeof(T), args)