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



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

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

相关内容

  • 没有找到相关文章

最新更新