假设以下方法,我知道它不起作用:
我想创建一个泛型
的新实例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#中的这个泛型方法中创建它作为一个新的泛型类型。
答案 0 :(得分:0)
您可以让您的泛型类型实现一个接口。然后在泛型方法中放置限制,只接受实现该接口的类型。这将允许您在新构建的项目上调用方法,因为它已知具有这些方法。
public interface ITest
{
void DoSomething();
}
public void GetData<T, U>(T varA, int acao) where U: ITest, new()
{
var item = new U();
item.DoSomething();
}
答案 1 :(得分:0)
通用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;
}