簡體   English   中英

在C#中將通用對象添加到通用列表

[英]Adding generic object to generic list in C#

我上課的相關部分看起來像

class C {
    void Method<T>(SomeClass<T> obj) {
        list.Add(obj);
    }
    List<?> list = new List<?>();
}

我應該如何定義列表以便類編譯?

我想要一個List<SomeClass<?>>類型的List<SomeClass<?>> ,它是SomeClass的對象列表,其中每個對象可以具有任何類型參數。 Java ? 構造允許這個; 什么是C#等價物? 如果不存在這樣的事情,是否有合適的解決方法? List<object>會做但非常難看。)

我認為你不能在C#中做到這一點......你必須在類中添加type參數:

class C<T> {
    void Method(SomeClass<T> obj) {
        list.Add(obj);
    }
    List<SomeClass<T>> list = new List<SomeClass<T>>();
}

另一種選擇是使用接口:

class C {

    void Method<T>(T obj)
         where T : ISomeClass {
        list.Add(obj);
    }
    List<ISomeClass> list = new List<ISomeClass>();
}

要做你想做的事,你有兩個選擇。

您可以使用List <object>,並處理對象。 這不是類型安全的,並且會對值類型有裝箱/拆箱問題,但它會起作用。

您的另一個選擇是使用通用約束來限制基類或接口,並使用List <Interface>。

不幸的是,在C#3.0中沒有直接的等價物,因為泛型是不變的。 您可以使用C#4.0安全協同/反差方法以優雅的方式執行此類操作。 要解決此問題,您可以從非泛型基礎繼承SomeClass<T>並創建List<BaseClass> 如果類的每個實例只應包含一個類型,則可以使類本身通用並在那里設置類型參數。

我對Java沒有任何了解? 構造,但我認為以下最接近保留現有語法,同時也符合您的描述。

    class SomeClass<T>
    {
    }

    class C
    {
        void Add<T>(SomeClass<T> item)
        {
            Type type = typeof(SomeClass<T>);
            if (!list.ContainsKey(type))
                list[type] = new List<SomeClass<T>>();
            var l = (List<SomeClass<T>>)list[type];
            l.Add(item);
        }

        public void Method<T>(SomeClass<T> obj)
        {
            Add(obj);
        }
        readonly Dictionary<Type, object> list = new Dictionary<Type, object>();
    }

用以下方法測試它:

    class Program
    {
        static void Main(string[] args)
        {
            var c = new C();
            var sc1 = new SomeClass<int>();
            var sc2 = new SomeClass<String>();
            c.Method(sc1);
            c.Method(sc2);
            c.Method(sc1);
            c.Method(sc2);
        }
    }

就個人而言,我會盡可能地這樣做; 將泛型參數從方法移動到類。

class C<T> {
    void Method(SomeClass<T> obj) {
        list.Add(obj);
    }
    List<?> list = new List<?>();
}

如果你的通用列表是一個成員,那么應該考慮到這一點來構建類。 如果沒有更多的使用環境,我們很難建議最好的模式。

暫無
暫無

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

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