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

时间:2009-12-06 12:15:19

标签: c# generics

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

  class Item {}
  class Container< T > {}
  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< int >() );
    }
  }

以下行不起作用:

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

是否可以在不明确将Container<>更改为Container<int>的情况下使其有效?我想知道该对象是“容器”类型,我真的没兴趣,它是Container<int>Container<string>。除了几十行反射之外的任何提示?

1 个答案:

答案 0 :(得分:27)

尝试:

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

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

class StringContainer : Container<string>

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

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

  return someType.BaseType != null 
          && IsGenericTypeOf(genericType, someType.BaseType);
}