2012-09-26 131 views
4

嘿,我有一個抽象泛型BList<TElement> where TElement : Career。職業也是抽象類型。如何測試類型是否來自抽象基類型?

給定類型T,如何測試它是否是BList類型?我該如何投入基礎課程?我試過(BList<Career>)object,但編譯器很不高興。顯然我不能寫BList<Career>因爲職業是抽象的。

+2

你應該可以使用'is'運算符 –

+1

顯示你的代碼。 「編譯器不高興」不會告訴我們很多。 –

回答

8

有一點你的問題的模糊性,所以我會嘗試回答的一些事情,我認爲你可能會問...

如果你想檢查是否一個實例T是BList你可以只使用is

if (someInstance is BList<Career>) 
{ 
... 
} 

如果你想看看一個泛型類型參數是一個BList<Career>你可以使用typeof

if (typeof(T) == typeof(BList<Career>) 
{ 
... 
} 

但是,如果你只是想看看它是否任何BList<>,你可以使用反射:

var t = typeof(T); // or someInstance.GetType() if you have an instance 

if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(BList<>)) 
{ 
    ... 
} 

現在,只要你如何投下BList<TElement>BList<Career>?你不能安全。

這有什麼好做Career是抽象的,它與事實BList<Career>繼承BList<TElement>TElement即使Career繼承做。

考慮一下:

public class Animal { } 

public class Dog : Animal { } 

public class Cat : Animal { } 

鑑於這些,問yoruself爲什麼這不工作:

List<Animal> animals = new List<Cat>(); 

看這個問題?如果我們讓你蒙上了List<Cat>List<Animal>,那麼所有的突然的Add()方法將支持Animal代替Cat,這意味着你可以這樣做:

animals.Add(new Dog()); 

顯然,沒有辦法,我們應該是能夠將Dog添加到List<Cat>。這就是爲什麼即使Cat繼承自Animal,也不能使用List<Cat>作爲List<Animal>

類似的情況在這裏。

+0

謝謝當我試圖問我的問題時,我都感到困惑。現在我明白了。 –

+0

@ColonelPanic:沒問題!很高興我能幫上忙! –

1
var item = theObject as BList<Career>; 

如果是null那麼它是該類型的不行。