嘿,我有一個抽象泛型BList<TElement> where TElement : Career
。職業也是抽象類型。如何測試類型是否來自抽象基類型?
給定類型T,如何測試它是否是BList類型?我該如何投入基礎課程?我試過(BList<Career>)object
,但編譯器很不高興。顯然我不能寫BList<Career>
因爲職業是抽象的。
嘿,我有一個抽象泛型BList<TElement> where TElement : Career
。職業也是抽象類型。如何測試類型是否來自抽象基類型?
給定類型T,如何測試它是否是BList類型?我該如何投入基礎課程?我試過(BList<Career>)object
,但編譯器很不高興。顯然我不能寫BList<Career>
因爲職業是抽象的。
有一點你的問題的模糊性,所以我會嘗試回答的一些事情,我認爲你可能會問...
如果你想檢查是否一個實例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>
。
類似的情況在這裏。
謝謝當我試圖問我的問題時,我都感到困惑。現在我明白了。 –
@ColonelPanic:沒問題!很高興我能幫上忙! –
var item = theObject as BList<Career>;
如果是null
那麼它是該類型的不行。
你應該可以使用'is'運算符 –
顯示你的代碼。 「編譯器不高興」不會告訴我們很多。 –