C# 在C中的泛型函数内实例化T的新对象#
我有两个模型,都可以使用下面的功能。我创建了一个由这两个模型实现的接口 在下面的函数中,我循环遍历传入列表,并使用其中的值创建列表的新版本C# 在C中的泛型函数内实例化T的新对象#,c#,object,generics,generic-programming,C#,Object,Generics,Generic Programming,我有两个模型,都可以使用下面的功能。我创建了一个由这两个模型实现的接口 在下面的函数中,我循环遍历传入列表,并使用其中的值创建列表的新版本 public static IList<T> GenericFunction<T>(IList<T> objList) where T : IProduct { // In this function I am doing the following: IList<T> retVal = ne
public static IList<T> GenericFunction<T>(IList<T> objList) where T : IProduct
{
// In this function I am doing the following:
IList<T> retVal = new List<T>();
foreach (T obj in objList)
{
T newObj = (T)Activator.CreateInstance(typeof(T));
newObj.Price = obj.BasePrice + obj.OldPrice;
newObj.Description = obj.Name + " " + obj.Description;
retVal.add(newObj);
}
return retVal;
}
公共静态IList泛型函数(IList objList),其中T:ipproduct
{
//在此函数中,我执行以下操作:
IList retVal=新列表();
foreach(对象列表中的T对象)
{
T newObj=(T)Activator.CreateInstance(typeof(T));
newObj.Price=obj.BasePrice+obj.OldPrice;
newObj.Description=obj.Name+“”+obj.Description;
retVal.add(newObj);
}
返回返回;
}
上述代码正在运行,但我有几个问题:
为了使上面的函数能够与实现IPProduct的任何模型一起工作,我唯一的选择是做我所做的事情,对吗?起初,我想我可以简单地创建一个标准函数,将IList
作为参数并返回IList
。但后来我遇到了实例化一个新对象的问题,这导致我创建了一个泛型函数
此外,我可以在newObj上使用对象初始值设定项来设置其属性吗
看到这一点后,我觉得我应该做一些不同的事情。如果您知道
IProduct
将始终有一个无参数构造函数,则可以通过一般约束实现这一点:
public static IList<T> GenericFunction<T>(IList<T> objList) where T : IProduct, new()
{
IList<T> retVal = new List<T>();
foreach (T obj in objList)
{
T newObj = new T();
newObj.Price = obj.BasePrice + obj.OldPrice;
newObj.Description = obj.Name + " " + obj.Description;
retVal.Add(newObj);
}
return retVal;
}
公共静态IList GenericFunction(IList objList),其中T:IProduct,new()
{
IList retVal=新列表();
foreach(对象列表中的T对象)
{
T newObj=新的T();
newObj.Price=obj.BasePrice+obj.OldPrice;
newObj.Description=obj.Name+“”+obj.Description;
retVal.Add(newObj);
}
返回返回;
}
new()
如果您知道ipproduct
将始终具有无参数构造函数,则可以通过一般约束实现这一点:
public static IList<T> GenericFunction<T>(IList<T> objList) where T : IProduct, new()
{
IList<T> retVal = new List<T>();
foreach (T obj in objList)
{
T newObj = new T();
newObj.Price = obj.BasePrice + obj.OldPrice;
newObj.Description = obj.Name + " " + obj.Description;
retVal.Add(newObj);
}
return retVal;
}
公共静态IList GenericFunction(IList objList),其中T:IProduct,new()
{
IList retVal=新列表();
foreach(对象列表中的T对象)
{
T newObj=新的T();
newObj.Price=obj.BasePrice+obj.OldPrice;
newObj.Description=obj.Name+“”+obj.Description;
retVal.Add(newObj);
}
返回返回;
}
new()代码>真的吗?您可以创建接口的实例吗Activator.CreateInstance(typeof(obj))
对我来说更有意义……他不是在创建一个从接口派生的类型的实例吗?为什么不添加new
约束并写入t newObj=new t()代码>?真的吗?您可以创建接口的实例吗Activator.CreateInstance(typeof(obj))
对我来说更有意义……他不是在创建一个从接口派生的类型的实例吗?为什么不添加new
约束并写入t newObj=new t()代码>?嗯,我在上收到以下intellisense错误:T newObj=new T();无法创建变量类型T的实例,因为它没有new()约束。是否添加了where T:ipproduct,new()
位?我没有找到!现在它起作用了。添加new()到底说明了什么?因此,只要它有一个无构造函数的参数,我就可以做得对吗?它告诉编译器类型T
必须有一个不带参数的构造函数,因此它知道它可以使用newt()
创建它。嗯,我在上得到以下智能感知错误:T newObj=new T();无法创建变量类型T的实例,因为它没有new()约束。是否添加了where T:ipproduct,new()
位?我没有找到!现在它起作用了。添加new()到底说明了什么?因此,只要它有一个无构造函数的参数,我就可以这样做。它告诉编译器类型T
必须有一个不带参数的构造函数,因此它知道可以使用new T()
创建它。