我得到一些静态只读字段值使用反射像这样
FieldInfo[] allUnits =
new Unit().GetType().GetFields(BindingFlags.Static | BindingFlags.Public);
然后我成功地得到了像这样的单个字段值
Unit v = (Unit)allUnits[0].GetValue(null);
Console.WriteLine(v.Symbol.StartsWith("e"));
,它也打印"True"那么为什么这个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
看起来,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;
Grant的解决方案也可以写成
IEnumerable<FieldInfo> fieldInfos = fields
.Select(f => f.GetValue(null))
.OfType<Unit>()
.Where(u => u.Symbol.StartsWith("e"));