如何创建返回泛型实例的泛型方法

本文关键字:泛型 实例 泛型方法 返回 何创建 创建 | 更新日期: 2023-09-27 18:33:13

我想创建简单的工厂类来实现这样的接口:

IFactory 
{
   TEntity CreateEmpty<TEntity>(); 
}

在此方法中,我想返回类型为TEntity(泛型类型)的实例。例:

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

可能吗?界面是否正确?

我试过这样的事情:

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 TestClass
{
    public TestClass ()
    {
    }
    ...
}

如果根本不指定任何构造函数,则默认情况下该类将具有公共默认构造函数。

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

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;
}
interface IFactory<TEntity> where T : new()
{
   TEntity CreateEmpty<TEntity>(); 
}

此方法将帮助您按该顺序传递参数,其中它们在构造函数中:

private T CreateInstance<T>(params object[] parameters)
{
    var type = typeof(T);
    return (T)Activator.CreateInstance(type, parameters);
}