2012-10-26 57 views
2

给定一个集合如何检查对象的针对一个类型列表类型?

IEnumerable<Type> supportedTypes 

什么检查给定对象是否为这些类型(或派生类型)的一个最好的方法是什么?

我的第一反应是做这样的事情:

// object target is a parameter passed to the method in which I'm doing this. 
if (supportedTypes.Count(supportedType => target is supportedType) > 0) 
{ 
    // Yay my object is of a supported type!!! 
} 

..但似乎并不奏效。我不能在这样的lambda表达式中使用“is”关键字吗?

回答

2

行,所以在打字的问题,并做更多的一些尝试,以确保我不是问一些真正愚蠢的过程中,我意识到一个简单的解决方案。张贴在这里以防别人做某事同样愚蠢。 ;-)

你不能用 “是”,在你的lambda表达式的关键字,但您可以使用:

supportedType => supportedType.IsInstanceOfType(target) 

产生:

if (supportedTypes.Count(supportedType => 
supportedType.IsInstanceOfType(target)) > 0) 

if (supportedTypes.Any(supportedType => 
           supportedType.IsInstanceOfType(target))) 
// object target is a parameter passed to the method in which I'm doing this. 
{ 
    // Yay my object is of a supported type!!! 
} 

帽尖鲍勃淡水河谷在低于该意见,我应该使用。任何(...),而不是被.Count中指出(...)> 0

+3

您应该使用的任何()而不是检查计数 –

+0

作为一个侧面说明,我多么希望自己精神上解析像'a.IsInstanceOf(B)'为_“是B的实例? “_ - 在这种情况下当然是倒退了。 –

+3

你确定'IsInstanceOf'是你想要的吗? 'IsAssignableFrom'听起来更像你想要的。 http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx – asawyer

2

你为什么不使用Containstarget.GetType

bool ar isSupported = supportedTypes.Contains(target.GetType()); 

Any

bool isSupported = supportedTypes.Any(t => t == target.GetType()); 

(不使用Enumerable.Count,如果你只是想知道,如果一个序列包含匹配的元素,这是相当低效如果sequnce大或谓语是昂贵)

编辑:如果你想利用继承的考虑,你可以使用Type.IsAssignableFrom

var isSupported = supportedTypes.Any(t => target.GetType().IsAssignableFrom(t)); 
  • is运算符用于检查实例是否与给定类型兼容。
  • IsAssignableFrom方法用于检查一个类型是否是与给定类型兼容。

确定是否当前的类型的实例可以从指定的类型的实例被分配 。

+0

.Contains或者显式检查与target.GetType()是否相等的问题是它不会处理继承类型。 supportedTypes可能包含'Fruit',我需要测试才能成功获得'Apple'或'Orange' –

+0

@RookieRick:编辑我的答案。 –