是否可以在泛型方法的主体内创建泛型类型的新实例?

本文关键字:新实例 实例 泛型类型 泛型方法 是否 主体 创建 | 更新日期: 2023-09-27 18:13:06

假设下面的方法,我知道它不起作用:

我想创建一个泛型类型的新实例

public List<TPer> getDATA<TPer>(TPer per, int acao) where TDal: new()
{
    //Is it possible create a new instance of a generic type inside the body of a generic method?
    TDal dal = new TDal(); //<-- I know it is NOT OK 
    List<TPer> lst = new List<TPer>();
    lst = dal.getDATA(per, acao);
    return lst;
}

我可以这样写:

List<TPer> getDATA<TPer,TDal>(TPer per, int acao) where TDal: new()

但是,调用这个方法的程序不能访问TDal:

是否可以使用空参数调用此方法?或者在泛型方法的主体内创建泛型类型的新实例?

<TDal>也将是泛型的,但我不知道是否有可能创建它,作为一个新的泛型类型,在c#中的这个泛型方法内部。

是否可以在泛型方法的主体内创建泛型类型的新实例?

可以让泛型类型实现一个接口。然后在泛型方法中设置限制,只接受实现该接口的类型。这将允许您在新构造的项上调用方法,因为它已知具有这些方法。

public interface ITest
{
    void DoSomething();
}
public void GetData<T, U>(T varA, int acao) where U: ITest, new()
{
    var item = new U();
    item.DoSomething();
} 

通用getDATA如何知道什么是TDal?它必须在getDATA方法或包含该方法的类中声明,即

class MyGenericClass<TDal> where TDal:new()
{
    public List<TPer> getDATA<TPer>(TPer per, int acao) where TDal : new()
    {
        TDal dal = new TDal();
        List<TPer> lst = new List<TPer>();
        lst = dal.getDATA(per, acao);
        return lst;
    }
}

在这两种情况下,调用者都需要知道TDal。

如果你需要避免这种情况,你可以在getDATA中做一些事情,从per.GetType()检索TDal类型,然后实例化该类。例如

    public List<TPer> getDATA<TPer>(TPer per, int acao)
    {
        List<TPer> lst = new List<TPer>();
        IDal dal;
        switch (per.GetType().Name)
        {
            case "Person": 
                dal = new DalPerson();
                break;
            case "Car":
                dal = new DalCar();
                break;
            default:
                throw new InvalidOperationException("I dont like per");
        }
        lst = dal.getDATA(per, acao);
        return lst;
    }