使用LINQ和反射来获取静态只读字段值失败

时间:2011-08-26 11:58:52

标签: c# linq reflection

我正在使用像这样的

反射得到一些静态只读字段值
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

2 个答案:

答案 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"));