c# - 在泛型约束中通过构造函数传递参数

标签 c# generics type-constraints

我想将构造函数中的参数传递到带有约束的泛型函数中。是否可以使用参数创建 T 实例?类似 list.Add(new T(1));

namespace ConsoleApplication
{
class Program
{
    static void Main(string[] args)
    {
        List<Base> list = new List<Base>();
        AddElement<Quick>(list,5);
        AddElement<Range>(list, 5); 
        Console.WriteLine(list.Count);
        Console.ReadKey();
    }
    public static void AddElement<T>(List<Base> list, int number) where T : Base, new ()
    {
       for (int i = 0; i < number; i++)
       {
           //do not working
           list.Add(new T(i));
       }
    }
}
public abstract class Base
{

}

public class Quick:Base
{
    private int ID;
    public Quick()
    {

    }
    public Quick(int ID)
    {
        this.ID = ID;
    }
}

public class Range : Base
{
    private int ID;
    public Range()
    {

    }
    public Range(int ID)
    {
        this.ID = ID;
    }
}
}

最佳答案

解决这个问题的通常方法是传递工厂方法或 Func<T>到方法:

public static void AddElement<T>(List<Base> list, int number, Func<T> factory) where T : Base
{
    for (int i = 0; i < number; i++)
    {
        list.Add(factory());
    }
}

您可以将其与 Quick 一起使用像这样的类:

var baseList = new List<Base>();
AddElement(baseList, 5, () => new Quick(1));

如果您希望能够通过int AddElement<T>() 内的构造函数参数您可以使用 Func<int, T>像这样:

public static void AddElement<T>(List<Base> list, int number, Func<int, T> factory) where T : Base
{
    for (int i = 0; i < number; i++)
    {
        list.Add(factory(i));
    }
}

然后这样调用它:

var baseList = new List<Base>();
AddElement(baseList, 5, x => new Quick(x));

关于c# - 在泛型约束中通过构造函数传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34181732/

相关文章:

c# - 支持单个类型参数的协变和逆变

swift - 类型约束的可选扩展对其他类型可见

f# - 如何对通用计算函数使用 f# 约束?

c# - C#中的字符串结尾

c# - MVC 新窗口瓶颈

java - 通用返回

c++ - 为什么编译器选择这个模板函数而不是重载的非模板函数?

c# - 尝试使用非托管 C++ DLL 时出现 SafeArrayTypeMismatchException

c# - 从 Web API 同步调用外部 API

C# 泛型类型约束