2013-07-01 80 views
4

一種考慮下面的類層次結構確定是否類是與多個泛型參數

public abstract class MyGenericClass<T1, T2> 
{ 
    public T1 Foo { get; set; } 
    public T2 Bar { get; set; } 
} 

public class BobGeneric : MyGenericClass<int, string>{} 
public class JimGeneric : MyGenericClass<System.Net.Cookie, System.OverflowException>{} 

我本來以爲我可以做到以下幾點

//All types in the assembly containing BobGeneric and JimGeneric 
var allTypes = _asm.GetTypes(); 

//This works for interfaces, but not here 
var specialTypes = allTypes.Where(x => typeof(MyGenericClass<,>).IsAssignableFrom(x)) 

//This also fails 
typeof(BobGeneric).IsSubclassOf(typeof(MyGenericClass<,>)).Dump(); 

我怎麼會在確定的子類代碼BobGeneric繼承自MyGenericClass

回答

7

您正在尋找GetGenericTypeDefinition

typeof(BobGeneric).GetGenericTypeDefinition().IsSubclassOf(typeof(MyGenericClass<,>)).Dump(); 

你可以想象方法「剝離了」所有泛型類型的參數,只留下其正式泛型參數的原始定義。

如果它不直接BobGeneric工作,您可能需要在類型層次結構向上導航直到你找到MyGenericClass<...,...>(或任何類型的其中IsGenericType回報true)。

+2

不得不更改爲'typeof(MyGenericClass <,>).IsAssignableFrom(typeof(BobGeneric).BaseType.GetGenericTypeDefinition())',但很多感謝指向正確的方向 – Joe

+0

我從一個類型參數轉到了兩個。 'typeof(MyGeneric <>)'不再工作。這是由於缺少逗號'<,>'。 –

+0

@MikedeKlerk:的確,你可以有幾個同名的類,只要它們接受不同數量的通用參數即可。因此,「MyGeneric <>」,「MyGeneric <,>」,「MyGeneric <,,>」等都是不同的類別。 –

相關問題