C# 创建泛型类型的实例

C# 创建泛型类型的实例,c#,activator,C#,Activator,我已经创建了一个类似以下描述的每个帮助器: 现在有了一个业务规则,当没有项时,创建一个虚拟项,这样循环执行一次。在foreach声明下面,我添加以下内容: if (!items.Any()) { var result = template(new IndexedItem<T>(1, ???)); result.WriteTo(writer); } //Fixed by doing: var result = template(new IndexedItem<T

我已经创建了一个类似以下描述的每个帮助器:

现在有了一个业务规则,当没有项时,创建一个虚拟项,这样循环执行一次。在foreach声明下面,我添加以下内容:

if (!items.Any()) {
    var result = template(new IndexedItem<T>(1, ???));
    result.WriteTo(writer);
}

//Fixed by doing:
var result = template(new IndexedItem<T>(1, default(T)));
if(!items.Any()){
var结果=模板(新的IndexedItem(1,??);
结果。写入(写入器);
}
//通过以下操作修复:
var结果=模板(新的IndexedItem(1,默认值(T));
这些问题表明我想创建一个T类型的虚拟对象,搜索时我找到了Activator.CreateInstance(),但我无法让它工作


我的问题是,首先,这是解决它的最佳方法,在创建一个类似于上面建议的虚拟对象后,让它执行。如果是这样的话,我将如何创建虚拟对象呢?

一种方法是在这里使用
T
的约束。因此,例如,这里定义
T
方法
需要添加如下约束:

where T : new()
请注意,必须在
T
上有一个无参数构造函数,并且它不能是
抽象的

新约束指定泛型类声明中的任何类型参数必须具有公共无参数构造函数。若要使用新约束,类型不能是抽象的


一种方法是在此处对
T
使用约束。因此,例如,这里定义
T
方法
需要添加如下约束:

where T : new()
请注意,必须在
T
上有一个无参数构造函数,并且它不能是
抽象的

新约束指定泛型类声明中的任何类型参数必须具有公共无参数构造函数。若要使用新约束,类型不能是抽象的


什么不适合Activator.CreateInstance?使用反射创建一个虚拟对象听起来是个坏主意,有很多惊喜等待着发生。但更重要的是,“循环执行一次”听起来不像是一个业务需求,而是某人对技术快速修复的想法。实际业务需求是什么?此外,在使用泛型时,通常只需执行
new T()
default(T)
而不显式使用反射。您可以向泛型类型参数添加约束:使用约束,您可以使用
new
而不使用反射的代码味道,例如
公共类泛型列表,其中T:new(){
我将所有的解决方案合并到一个解决方案中。因此我添加了新的T()和where T:new(){,因此出现了一些复杂的问题和错误。现在我只使用默认的(T)什么东西不能用Activator.CreateInstance?使用反射创建一个虚拟对象听起来是个坏主意,有很多惊喜等待着发生。但更重要的是,“循环执行一次”听起来不像是业务需求,而是某人对技术快速修复的想法。实际的业务需求是什么?此外,在使用泛型时,通常只需执行
new t()
default(t)
而不是显式使用反射。您可以向泛型类型参数添加约束:使用约束,您可以使用
new
而不是使用反射的代码味道,例如
公共类GenericList where T:new(){
我将所有解决方案组合到一个解决方案中。因此,我添加了新的T()和where T:new(){,所以出现了一些复杂的问题和错误。现在我只使用默认值(T),它作为一个咒语工作。Thx:)