如何根据类型列表检查对象的类型?

时间:2012-10-26 22:29:26

标签: c# linq lambda

给出一个集合

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 个答案:

答案 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)

为什么不使用Containstarget.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的实例。