2011-08-26 26 views
0

我使用反射像這樣使用LINQ和反射來獲取靜態只讀域值失敗

FieldInfo[] allUnits = 
    new Unit().GetType().GetFields(BindingFlags.Static | BindingFlags.Public); 

得到一些靜態只讀字段的值,然後我成功地得到這樣

Unit v = (Unit)allUnits[0].GetValue(null); 
Console.WriteLine(v.Symbol.StartsWith("e")); 
單個字段值

,它也打印「真」 那麼爲什麼這個LINQ查詢得到多個像這樣的同樣的字段值...

IEnumerable<FieldInfo> fis2 = 
    from fi in allUnits 
    where ((Unit)fi.GetValue(null)).Symbol.StartsWith("e") 
    select fi; 

...失敗併產生一個空的結果集?

我得到的例外是System.SystemException: specified cast is not valid

+0

是一個點在這一行中,在演員陣營和符號...((單位)fi.GetValue(空))之間。Symbol.StartsWith(「e」) – jjchiw

回答

3

這樣看來,通過fi.GetValue(null)返回的值之一的類型不是在Unit類型的事實;你會是安全上做的類型檢查,反正用一個條款,如fi.FieldType == typeof(Unit),或類似的東西,這樣的:有

IEnumerable<FieldInfo> fieldInfos = 
    from field in fields 
    where field.FieldType == typeof(Unit) && 
     ((Unit)field.GetValue(null)).Symbol.StartsWith("e") 
    select field; 
+0

做了這個伎倆,非常感謝! – mtijn

1

格蘭特的解決方案也可以寫成

IEnumerable<FieldInfo> fieldInfos = fields 
    .Select(f => f.GetValue(null)) 
    .OfType<Unit>() 
    .Where(u => u.Symbol.StartsWith("e"));