[英]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.