【问题标题】:Instantiating a new object of T inside of a generic function in C#在 C# 中的泛型函数内实例化 T 的新对象
【发布时间】:2016-03-10 00:40:37
【问题描述】:

我有两个模型都可以使用下面的功能。我创建了一个接口,这两个模型都实现了。

在下面的函数中,我遍历传入的列表并使用其中的值来创建列表的新版本。

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;
}

上面的代码可以运行,但我有几个问题:

为了使上述功能适用于任何实现 IProduct 的模型,我所做的就是我唯一的选择,对吗?起初我想我可以简单地创建一个标准函数,将IList&lt;IProduct&gt; 作为参数并返回IList&lt;IProduct&gt;。但后来我遇到了实例化一个新对象的问题,这导致我创建了一个通用函数。

另外,我可以在 newObj 上使用对象初始化器来设置它的属性吗?

看到这个StackOverflow post 后,我觉得我应该做一些不同的事情。

【问题讨论】:

  • 真的吗?你可以创建一个接口的实例吗? Activator.CreateInstance(typeof(obj)) 对我来说更有意义...
  • 他不是在做一个从接口派生的类型的实例吗?
  • 为什么不添加new约束并写T newObj=new T();

标签: c# object generics generic-programming


【解决方案1】:

如果你知道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;
}

new() 约束 T 使其必须具有无参数构造函数 - 允许通过 T newObj = new T(); 对其进行实例化。

【讨论】:

  • 嗯,我收到以下智能感知错误:T newObj = new T();无法创建变量类型 T 的实例,因为它没有 new() 约束。
  • 您添加了where T : IProduct, new() 位吗?
  • 我错过了!现在它起作用了。究竟是什么添加 new() 告诉它?所以只要它有一个无构造函数的参数我就可以做到这一点吗?
  • 它告诉编译器 T 类型必须有一个不带参数的构造函数,所以它知道它可以使用 new T() 创建它。
猜你喜欢
  • 1970-01-01
  • 2020-11-27
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多