簡體   English   中英

在不知道類型的情況下構造通用 class

[英]Construct Generic class without knowing type

我想在不知道類型的情況下構造一個具有通用參數的通用 class。

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'需要一種類型的參數。

聲明類型時需要指定泛型參數:

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 級別而不是方法級別:

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

這可能會解決您的問題:

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

你在這里需要兩件事,

  1. 您的 class 實例應該期望通用參數,即<T> ,因此創建GenericClass的實例

     new GenericClass<T>(t1, t2)
  2. 為避免編譯時錯誤,請正確定義您的列表

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM