C# 如何根据类型列表检查对象的类型?
收集C# 如何根据类型列表检查对象的类型?,c#,linq,lambda,C#,Linq,Lambda,收集 IEnumerable<Type> supportedTypes …但这似乎不起作用。我能不能在像这样的lambda表达式中使用“is”关键字?好的,在键入问题并进行更多实验以确保我没有问一些非常愚蠢的问题的过程中,我发现了一个简单的解决方案。在这里发布,以防其他人做同样愚蠢的事情。;-) 不能在lambda表达式中使用“is”关键字,但可以使用: supportedType => supportedType.IsInstanceOfType(target) 屈服:
IEnumerable<Type> supportedTypes
…但这似乎不起作用。我能不能在像这样的lambda表达式中使用“is”关键字?好的,在键入问题并进行更多实验以确保我没有问一些非常愚蠢的问题的过程中,我发现了一个简单的解决方案。在这里发布,以防其他人做同样愚蠢的事情。;-) 不能在lambda表达式中使用“is”关键字,但可以使用:
supportedType => supportedType.IsInstanceOfType(target)
屈服:
Bob Vale在下面的评论中指出,我本应该使用.Any(…)而不是.Count(…)>0好吧,在键入问题并进行更多实验以确保我没有问一些真正愚蠢的问题的过程中,我意识到了一个简单的解决方案。在这里发布,以防其他人做同样愚蠢的事情。;-) 不能在lambda表达式中使用“is”关键字,但可以使用:
supportedType => supportedType.IsInstanceOfType(target)
屈服:
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
,如果sequnce很大或谓词很昂贵,则这种方法效率很低)
编辑:如果要考虑继承,可以使用:
运算符用于检查实例是否与给定类型兼容is
方法用于检查类型是否与给定类型兼容IsAssignableFrom
为什么不使用
Contains
和target.GetType
bool ar isSupported = supportedTypes.Contains(target.GetType());
或Any
bool isSupported = supportedTypes.Any(t => t == target.GetType());
(如果您只想知道序列是否包含匹配元素,请不要使用Enumerable.Count
,如果sequnce很大或谓词很昂贵,则这种方法效率很低)
编辑:如果要考虑继承,可以使用:
运算符用于检查实例是否与给定类型兼容is
方法用于检查类型是否与给定类型兼容IsAssignableFrom
您应该使用Any()而不是检查计数作为旁注,我发现自己想在心里将类似于
a.IsInstanceOf(b)
的内容解析为“是b的一个实例吗?”-在本例中,这当然是向后的。您确定IsInstanceOf
是您想要的吗IsAssignableFrom
听起来更像您真正想要的@不,IsAssignable适用于目标是类型的情况,IsInstance适用于目标是对象的情况,您希望确定其类型我想,IsInstanceOfType
(注意,我在答案中键入了错误的方法名称..编辑并修复了)是我在这里想要的,因为我被交给了一个已经实例化的对象引用。似乎要使用IsAssignableFrom
我必须明确地获取该对象,并询问它是什么类型,这似乎是一个额外的操作,除非我遗漏了什么….?你应该使用Any()而不是检查计数作为旁注,我发现我自己想在心里解析类似a.IsInstanceOf(b)
的东西“a是b的一个例子吗?“-在这种情况下,哪个当然是向后的。您确定IsInstanceOf
是您想要的吗IsAssignableFrom
听起来更像您真正想要的@不,IsAssignable适用于目标是类型的情况,IsInstance适用于目标是对象的情况,您希望确定其类型我想,IsInstanceOfType
(注意,我在答案中键入了错误的方法名称..编辑并修复了)是我在这里想要的,因为我被交给了一个已经实例化的对象引用。似乎要使用IsAssignableFrom
我必须显式地获取该对象,并询问它是什么类型,这似乎是一个额外的操作,除非我遗漏了什么..?与target.GetType()
相等的.Contains或显式检查的问题是它不会处理继承的类型。支持的类型可能包括Fruit
,我需要对Apple
或Orange
@RookieRick:编辑了我的答案。.Contains或显式检查与target.GetType()是否相等的问题在于它不会处理继承的类型。支持的类型可能包括水果
,我需要通过苹果
或橙色
@RookieRick:编辑我的答案。
var isSupported = supportedTypes.Any(t => target.GetType().IsAssignableFrom(t));