说明我的问题的最佳方法是使用以下示例代码:
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<>
into Container<int>
?我想知道该对象是“Container”类型,但我真的不感兴趣,是吗?Container<int>
or Container<string>
。除了几十行反思之外还有什么提示吗?
Try:
typeof(Container<>) == something.GetType().GetGenericTypeDefinition()
请注意,只有当实际类型为Container<T>
。它不适用于派生类型。例如,它会返回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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)