использование LINQ и отражения для получения статических значений полей только для чтения не удается - PullRequest
0 голосов
/ 26 августа 2011

Я получаю некоторые статические значения полей только для чтения, используя отражение, как это

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 ]

3 голосов
/ 26 августа 2011

Может показаться, что тип одного из значений, возвращаемых 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 голос
/ 03 сентября 2013

Решение Гранта также можно записать как

IEnumerable<FieldInfo> fieldInfos = fields
    .Select(f => f.GetValue(null))
    .OfType<Unit>()
    .Where(u => u.Symbol.StartsWith("e"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...