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

C# 使用LINQ和反射获取静态只读字段值失败,c#,linq,reflection,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")); 然后我成功地得到了这样一个字段值 FieldInfo[] allUnits

我使用这样的反射获得一些静态只读字段值

FieldInfo[] allUnits =
    new Unit().GetType().GetFields(BindingFlags.Static | BindingFlags.Public);
Unit v = (Unit)allUnits[0].GetValue(null);
Console.WriteLine(v.Symbol.StartsWith("e"));
然后我成功地得到了这样一个字段值

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;
IEnumerable fis2=
来自阿伦尼斯的菲
其中((单位)fi.GetValue(null)).Symbol.StartsWith(“e”)
选择fi;
…失败并生成空结果集


我得到的异常是
System.SystemException:指定的强制转换无效

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;
IEnumerable字段信息=
从田野到田野
其中field.FieldType==类型(单位)和
((单位)field.GetValue(null)).Symbol.StartsWith(“e”)
选择字段;

fi.GetValue(null)
返回的一个值的类型实际上不是类型
单位
;您可以安全地使用另一个子句(如
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;
IEnumerable字段信息=
从田野到田野
其中field.FieldType==类型(单位)和
((单位)field.GetValue(null)).Symbol.StartsWith(“e”)
选择字段;

格兰特的解决方案也可以写成

IEnumerable<FieldInfo> fieldInfos = fields
    .Select(f => f.GetValue(null))
    .OfType<Unit>()
    .Where(u => u.Symbol.StartsWith("e"));
IEnumerable fieldInfos=字段
.Select(f=>f.GetValue(null))
第()类
其中(u=>u.Symbol.StartsWith(“e”));

格兰特的解决方案也可以写成

IEnumerable<FieldInfo> fieldInfos = fields
    .Select(f => f.GetValue(null))
    .OfType<Unit>()
    .Where(u => u.Symbol.StartsWith("e"));
IEnumerable fieldInfos=字段
.Select(f=>f.GetValue(null))
第()类
其中(u=>u.Symbol.StartsWith(“e”));