我正在使用像这样的
反射得到一些静态只读字段值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
答案 0 :(得分: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;
答案 1 :(得分:1)
Grant的解决方案也可以写成
IEnumerable<FieldInfo> fieldInfos = fields
.Select(f => f.GetValue(null))
.OfType<Unit>()
.Where(u => u.Symbol.StartsWith("e"));