我有以下的一般類:如何測試兩個泛型是否具有基類 - 子類關係而不實例化它們?
class Base<T> where T : ... { ... }
class Derived<T> : Base<T> where T : ... { ... }
class Another<T> where T : ... { ... }
class DerivedFromDerived<T> : Derived<T> where T : ... { ... }
某處在我的代碼,我想從Base<T>
測試是否一個給定的通用繼承,而無需創建通用的特定實例。我怎麼做?
static bool DerivedFromBase(Type type) { /* ??? */ }
static void Main(string[] args)
{
Console.WriteLine(DerivedFromBase(typeof(Derived<>))); // true
Console.WriteLine(DerivedFromBase(typeof(Another<>))); // false
Console.WriteLine(DerivedFromBase(typeof(DerivedFromDerived<>))); // true
Console.ReadKey(true);
}
編輯:謝謝你馬克。現在我看到了光。我原本試過以下幾種:
typeof(Derived<>).BaseType == typeof(Base<>)
顯然,這是正確的。 但事實並非如此。問題是Base
的T是不一樣的東西Derived
的T.因此,在
typeof(Base<>)
Base
的T
是一個免費的類型。但是,在
typeof(Derived<>).BaseType
Base
的T
勢必Derived
的T
,這是又一個免費類型。 (這是如此真棒我會LOVE看到System.Reflection
的源代碼!)現在,
typeof(Derived<>).BaseType.GetGenericTypeDefinition()
unbounds Base
的T
。結論:
typeof(Derived<>).BaseType.GetGenericTypeDefinition() == typeof(Base<>)
現在,如果你們都對不起,我的頭就在燃燒。
我感興趣的答案在這裏,因爲我覺得* *'衍生'不是Base ' –
2011-04-08 22:44:50
@馬特·格里爾的'子類:的確,衍生''不'基地'的子類。 –
pyon
2011-04-08 22:50:04
我認爲馬克已經正確地回答了你的問題,但我認爲你可能意味着馬特上面提到的其他東西。你能澄清嗎? – briantyler 2011-04-08 22:53:51