在不知道类型的情况下构造泛型类

时间:2020-04-06 08:24:06

标签: c# generics

我想在不知道类型的情况下使用泛型参数构造一个泛型类。

List<T> genericList = new List<T>();

public void AddGenericValue<T>(T t1, T t2)
{
    for (int i = 0; i < genericList.Count; i++)
    {
        if (genericList[i].t1 == t1)
        {
            genericList[i].t2 = t2;
            return;

        }
    }

    genericList.Add(new GenericClass(t1, t2));
}

public class GenericClass<T>
{
    T t1;
    T t2;

    public GenericClass(T t1, T t2)
    {
        this.t1 = t1;
        this.t2 = t2;
    }
}

现在我出错了。使用通用类型'GenericClass'需要1种类型的参数。

3 个答案:

答案 0 :(得分:2)

说明类型时需要指定通用参数

new GenericClass<T>(t1, t2)

其原因是不能为类推断类型参数,只能为方法推断类型参数。您可以通过编写工厂来利用它:

static class GenericClassFactory
{
  public static GenericClass<T> Create(T t1, T t2)
  {
    return new GenericClass<T>(t1, t2);
  }
}

现在您可以:

var foo = GenericClassFactory.Create(1, 2);

T将由编译器推导。

此外,列表应为正确的类型:

var genericList = new List<GenericClass<T>>();

如果需要将列表存储为成员变量,则需要将泛型类型提升为类级别,而不是方法级别:

class Foo<T>
{
    private readonly List<GenericClass<T>> genericList = new List<GenericClass<T>>();

    public void AddGenericValue(T t1, T t2)
    {
        for (int i = 0; i < genericList.Count; i++)
        {
            if (genericList[i].t1 == t1)
            {
                genericList[i].t2 = t2;
                return;

            }
        }

        genericList.Add(new GenericClass<T>(t1, t2));
    }
}

答案 1 :(得分:0)

这可能会解决您的问题:

List<GenericClass<T>> genericList = new List<GenericClass<T>>();
genericList.Add(new GenericClass<T>(t1, t2));

答案 2 :(得分:0)

您需要在这里做两件事,

  1. 您的类实例应具有通用参数,即<T>,因此,像

    一样创建GenericClass实例
      new GenericClass<T>(t1, t2)
    
  2. 为避免编译时错误,请正确定义列表

      List<GenericClass<T>> genericList = new List<GenericClass<T>>();