![](/img/trans.png)
[英]How can I execute a method with type <T> against an iteration of types?
[英]How can I check the type of an object against a list of types?
给定一个集合
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”关键字吗?
好的,所以在输入问题并进行更多实验以确保我没有问到真正愚蠢的事情的过程中,我实现了一个简单的解决方案。 张贴在这里,以防别人做同样愚蠢的事情。 ;-)
您不能在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!!!
}
Bob Vale的提示,在下面的评论中指出我应该一直使用.Any(...)而不是.Count(...)> 0
为什么不使用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的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.