2016-04-06 83 views
0

我:拉姆达的typeof使用表达式

CustomObjekt temp = myCustomList.Find(x => typeof(x.myTyp) is T) 

这在语法上是不正确的,那会是正确的?

+1

是什么类型'x.myTyp'?你需要支持继承吗? (即''x.myTyp''可以是'T'或者从**'T'继承吗? –

+0

嗨,'x.myTyp'是用'dynamic'声明的,通常'x.myTyp'包含这个值'typeof(AnyObject)' – kkkk00999

回答

2

你可以使用Enumerable.OfTypeFirstOrdefault

CustomObjekt temp = myCustomList.OfType<CustomObjekt>().FirstOrDefault(); 

如果对象本身是该类型的不是,但你必须检查属性的类型,使用Where

CustomObjekt temp = myCustomList.Where(x => x.myTyp.GetType() == typeof(T)).FirstOrDefault(); 

如果它是您也可以用myCustomList.Find代替Where...FirstOrdefault()

CustomObjekt temp = myCustomList.Find(x => x.myTyp.GetType() == typeof(T)); 
+2

但是'typeof(x.myTyp)'不会编译O_o –

+2

类似于typeof(“”)'的东西也不会编译太......'typeof(x.myTyp)'是绝对的不正确,不是吗? –

+0

@MatíasFidemraizer:现在应该工作。 –

0

这在lambda表达式,委托或任何地方都不正确。

typeof运算符将从给定类型标识符获取Type实例。例如typeof(string)

在你的情况,你需要使用Type.IsAssignableFrom

CustomObjekt temp = myCustomList.Find(x => typeof(T).IsAssignableFrom(x.myTyp)); 

Type.IsAssignableFrom拥有someType == typeof(T)一个好处:它需要继承帐户。这是is运营商最接近的解决方案,因为is表达式也会给true如果B is A如果B继承A

0

你可以使用的GetType()是这样的:

CustomObjekt temp = myCustomList.Find(x => x.myTyp.GetType() == typeof(T)); 
+0

谢谢,但'x.myTyp'是动态的,所以我不能使用它像你写的。 – kkkk00999