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()
创建它。