为什么这个泛型方法要求T有一个公共的无参数构造函数?

时间:2008-10-30 20:00:11

标签: c# generics

public void Getrecords(ref IList iList,T dataItem) 
{ 
  iList = Populate.GetList<dataItem>() // GetListis defined as GetList<T>
}

dataItem可以是我的订单对象或用户对象,它将在运行时决定。上面不起作用,因为它给了我这个错误 类型'T'必须具有公共无参数构造函数,以便在泛型类型中将其用作参数'T'

5 个答案:

答案 0 :(得分:6)

public void GetRecords<T>(ref IList<T> iList, T dataitem)
{
}

你还在寻找什么?

修改问题:

 iList = Populate.GetList<dataItem>() 

“dataitem”是一个变量。您想在那里指定类型:

 iList = Populate.GetList<T>() 
  

“T”类型必须是公开的   无参数构造函数   在通用中将它用作参数'T'   类型GetList:new()

这就是说当你定义Populate.GetList()时,你声明它是这样的:

IList<T> GetList<T>() where T: new() 
{...}

告诉编译器GetList只能使用具有公共无参数构造函数的类型。你使用T在GetRecords中创建一个GetList方法(这里指的是不同的类型),你必须对它施加相同的限制:

public void GetRecords<T>(ref IList<T> iList, T dataitem) where T: new() 
{
   iList = Populate.GetList<T>();
}

答案 1 :(得分:4)

您修改后的问题将dataItem作为T类型的对象传递,然后尝试将其用作GetList()的类型参数。也许您只传递dataItem作为指定T的方式?

如果是这样,你可能想要这样的东西:

public IList<T> GetRecords<T>() {
  return Populate.GetList<T>();
}

然后你这样称呼:

IList<int> result = GetRecords<int>();

答案 2 :(得分:2)

要求公共的无参数构造函数的问题只能是因为Populate.GetList需要它 - 即具有“T:new()”约束。要解决此问题,只需在方法中添加相同的约束即可。

实际上,我怀疑ref是一个很好的策略。在推送时,out可能会(因为您没有读取该值),但更简单(更期望)的选项是返回值:

public IList<T> GetRecords<T>(T dataItem) where T : new()
{  // MG: what does dataItem do here???
  return Populate.GetList<T>();
}

当然,此时,来电者也可以直接拨打Populate.GetList

我怀疑你也可以删除dataItem ......但问题并不完全清楚。

如果您不打算通用(并且dataItem是模板对象),那么您可以通过MakeGenericMethod执行此操作:

public static IList GetRecords(object dataItem) 
{
    Type type = dataItem.GetType();
    return (IList) typeof(Populate).GetMethod("GetList")
        .MakeGenericMethod(type).Invoke(null,null);
}

答案 3 :(得分:-1)

你可以使用Generic with&lt; T>这将在运行时接受你想要的类型。

答案 4 :(得分:-1)

Getrecords<T> ...

这应该包含您需要的更详细信息。 http://msdn.microsoft.com/en-us/library/twcad0zb(VS.80).aspx