2016-03-31 34 views
2

我在我的C#項目中有三個類:GenericClass<T>,其中T可以是BaseClass或子類​​。是否可以將一個GenericClass <SubClass>添加到C#中的List <GenericClass <Base>>?

我需要創建一個GenericClass<BaseClass>的列表,它接受GenericClass<BaseClass>或通用中的BaseClass的後代。我試圖通過創建List<GenericClass<BaseClass>>像下面這樣做:

List<GenericClass<BaseClass>> list = new List<GenericClass<BaseClass>>(); 
GenericClass<SubClass> test = new GenericClass<SubClass>(); 
list.Add(test); 

C#拒絕執行此操作,告訴我,一個GenericClass<SubClass>不是GenericClass<BaseClass>。爲什麼是這樣?這似乎違反直覺,因爲​​是BaseClass的一種形式。

GenericClass<T>被設計成可註冊的類型,遊戲腳本可以使用它來封裝從基礎對象下降的自定義遊戲對象類型。有沒有辦法實現這一點,而不使用反射? BaseClass包含所有對象通用的代碼方法,所以它不能被製作成接口。

+0

這些類是如何定義的? –

+0

我忘記提及的唯一的事情是'GenericClass'被定義爲: 'public class GenericClass < T > where T:BaseClass,new()' –

+0

[這是什麼目的?](http:// xyproblem。 info /) –

回答

0

你可以從這個基類中添加一個基類,讓你的GenericClass<T>繼承:

public class GenericClass { } 

public class GenericClass<T> : GenericClass { } 

所以現在你可以創建一個List<GenericClass>

var list = new List<GenericClass>(); 
list.Add(new GenericClass<BaseClass>()); 
list.Add(new GenericClass<SubClass>()); 
1

只能爲接口做到這一點,而不是具體的實施。

如果你的類定義如下:

public interface IGeneric<out T> where T : BaseClass, new() { } 
public class GenericClass<T> : IGeneric<T> where T : BaseClass, new() { } 

public interface IBase { } 
public class BaseClass { } 
public class SubClass : BaseClass { } 

你可以這樣做:

List<IGeneric<BaseClass>> list = new List<IGeneric<BaseClass>>(); 
GenericClass<SubClass> test = new GenericClass<SubClass>(); 
list.Add(test); 

注意,列出通用的說法是IGeneric,不GenericClass

相關問題