2016-04-06 127 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