gpt4 book ai didi

c# - 如何创建返回泛型实例的泛型方法?

转载 作者:太空宇宙 更新时间:2023-11-03 17:43:46 25 4
gpt4 key购买 nike

我想创建一个简单的工厂类来实现这样的接口(interface):

IFactory 
{
TEntity CreateEmpty<TEntity>();
}

在这个方法中,我想返回一个 TEntity 类型(通用类型)的实例。示例:

TestClass test = new Factory().CreateEmpty<TestClass>(); 

这可能吗?接口(interface)是否正确?

我试过这样的:

private TEntity CreateEmpty<TEntity>() {
var type = typeof(TEntity);
if(type.Name =="TestClass") {
return new TestClass();
}
else {
...
}
}

但它无法编译。

最佳答案

需要在泛型类型参数上指定new()约束

public TEntity CreateEmpty<TEntity>() 
where TEntity : new()
{
return new TEntity();
}

新约束指定所使用的具体类型必须具有公共(public)默认构造函数,即不带参数的构造函数。

public TestClass
{
public TestClass ()
{
}

...
}

如果您根本不指定任何构造函数,那么默认情况下该类将具有一个公共(public)默认构造函数。

您不能在 new() 约束中声明参数。如果您需要传递参数,则必须为此目的声明一个专用方法,例如通过定义适当的接口(interface)

public interface IInitializeWithInt
{
void Initialize(int i);
}

public TestClass : IInitializeWithInt
{
private int _i;

public void Initialize(int i)
{
_i = i;
}

...
}

在你的工厂

public TEntity CreateEmpty<TEntity>() 
where TEntity : IInitializeWithInt, new()
{
TEntity obj = new TEntity();
obj.Initialize(1);
return obj;
}

关于c# - 如何创建返回泛型实例的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10461909/

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