public void Getrecords(ref IList iList,T dataItem)
{
iList = Populate.GetList<dataItem>() // GetListis defined as GetList<T>
}
dataItem可以是我的订单对象或用户对象,它将在运行时决定。上面不起作用,因为它给了我这个错误 类型'T'必须具有公共无参数构造函数,以便在泛型类型中将其用作参数'T'
答案 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