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

C# 是否可以在泛型方法的主体内创建泛型类型的新实例?,c#,generics,optimization,parameters,instance,C#,Generics,Optimization,Parameters,Instance,假设采用以下方法,我知道它不起作用: 我想创建泛型类型的新实例 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(); //<--

假设采用以下方法,我知道它不起作用:

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

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:

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


也将是泛型的,但我不知道是否有可能在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类型,然后实例化该类。 即


我不知道你想要达到什么目标,也不知道你为什么要创建一个新的列表,然后立即放弃它。TDal dal=new TDal NOT OK(新TDal不正常)是以什么方式出现的?该方法的第一个版本没有显示TDal应该是什么以及它来自哪里。怎么办?最好是编辑,而不是重新发布。@JonSkeet,它不正常,因为编译器错误:找不到类型或命名空间名称“TDal”。lst是该方法的返回。@Jon,谢谢你的评论,我想创建一个新的TDal实例,TDal也将是泛型的,但我不知道是否可以在C中的这个泛型方法中创建它。非常感谢。我喜欢这个答案。嗯,我对C和泛型的了解不多,我的实际项目比这个问题中的代码复杂得多,但我会尝试实现你的建议。如果这个解决方案是可实现的,请将其标记为正确答案。这不完全是我想要的,但它帮助我更好地理解泛型。如果可能的话,我想再等一会儿,以获得更多的答案。也许如果我把答案标记为正确答案,人们就不会再给出答案了。
    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;
    }