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”));