C# 初始化泛型类型对象时是否设置只读变量?

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); 我正在努力

我有以下内容:基类SystemBody(它有3个只读字段,必须在构造函数中设置,并且在对象的生存期内永远不会更改)、来自SystemBody的任意派生类以及以下通用方法:

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)