给出一个集合
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”关键字吗?
答案 0 :(得分:2)
好的,所以在输入问题的过程中,做一些更多的实验,以确保我没有要求一些非常愚蠢的东西,我意识到一个简单的解决方案。在这里张贴以防其他人做过同样愚蠢的事情。 ; - )
您不能在lambda表达式中使用“is”关键字,但可以使用:
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!!!
}
在下面的评论中注意到我应该使用.Any(...)而不是.Count(...)&gt; 0
答案 1 :(得分:2)
为什么不使用Contains
和target.GetType
?
bool ar isSupported = supportedTypes.Contains(target.GetType());
或Any
bool isSupported = supportedTypes.Any(t => t == target.GetType());
(如果你只是想知道一个序列是否包含匹配的元素,请不要使用Enumerable.Count
,如果序列很大或者谓词很昂贵,则效率相当低)
修改:如果您想继承帐户,可以使用Type.IsAssignableFrom
:
var isSupported = supportedTypes.Any(t => target.GetType().IsAssignableFrom(t));
is
运算符用于检查实例是否与给定类型兼容。IsAssignableFrom
方法用于检查Type是否与给定类型兼容。确定是否可以分配当前Type的实例 来自指定Type的实例。