如何将对象的类型与generics类型进行比较,与generics参数无关?

说明我的问题的最好方法是使用此示例代码:

class Item {} class Container {} class Program { static void DoSomething( object something ) { if( typeof( Item ) == something.GetType() ) { System.Console.WriteLine( "Item" ); } else if( typeof( Container ) == something.GetType() ) { System.Console.WriteLine( "Container" ); } } static void Main( string[] args ) { DoSomething( new Item() ); DoSomething( new Container() ); } } 

以下行不起作用:

 else if( typeof( Container ) == something.GetType() ) 

是否可以在不将Container显式更改为Container情况下使其工作? 我想知道对象是’Container’类型,我真的没有兴趣是Container还是Container 。 除了几十行reflection之外的任何提示?

尝试:

 typeof(Container<>) == something.GetType().GetGenericTypeDefinition() 

请注意,如果实际类型为Container ,则仅返回true。 它不适用于派生类型。 例如,它将为以下内容返回false

 class StringContainer : Container 

如果你需要让它适用于这种情况,你应该遍历inheritance层次结构并测试每个基类是否为Container

 static bool IsGenericTypeOf(Type genericType, Type someType) { if (someType.IsGenericType && genericType == someType.GetGenericTypeDefinition()) return true; return someType.BaseType != null && IsGenericTypeOf(genericType, someType.BaseType); }