Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据类型列表检查对象的类型?_C#_Linq_Lambda - Fatal编程技术网

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));