2010-10-10 2 views
1

У меня есть определенная-структура, как этотПолучить общедоступные поля?

private struct Combinators 
{ 
    public const char DirectChild = '>'; 
    public const char NextAdjacent = '+'; 
    public const char NextSiblings = '~'; 
    public const char Descendant = ' '; 
} 

Я хочу использовать отражение, чтобы получить список всех значений public const char полея в структурах (как можно точнее). Как я могу это сделать?

ответ

8
var fieldValues = typeof(Combinators) 
    .GetFields() 
    .Where(x => x.FieldType == typeof(char) && x.IsLiteral) 
    .ToDictionary(x => x.Name, x => (char)x.GetValue(null)); 

Возвращает Dictionary<string, char> где ключ имя поля, а значение является значением поля (как символ).

Update: Добавлено где предложение на основе комментариев и предложение @ nasufara, и добавил IsLiteral чек, основанный на @Jeff M-х.

+0

Несомненно, вы не имеете в виду 'null'? Или это разрешено, потому что их const? Вы можете сделать это лучше, используя 'GetFields (BindingFlags.Public)' no? Можете ли вы также ограничить его полями 'char'? – mpen

+0

@Mark, 'BindingFlags.Public' является значением по умолчанию, поэтому вам не нужно его передавать. И вы всегда передаете значение null для полей 'const' или' static' (поскольку аргумент ссылается на * экземпляр *, которого нет). –

+2

Вставка символа '.Where (x => x.FieldType == typeof (char))' между '.GetFields()' и '.ToDictionary (...)' должна ограничивать его символами. – mgbowen

0
private class TypedEnum<T> : IEnumerable<T> 
{ 
    public IEnumerator<T> GetEnumerator() 
    { 
     return GetType().GetFields().Select(f => f.GetValue(null)).OfType<T>().GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

private class Combinators : TypedEnum<char> 
{ 
    public const char DirectChild = '>'; 
    public const char NextAdjacent = '+'; 
    public const char NextSiblings = '~'; 
    public const char Descendant = ' '; 
} 

Edit: Мля ... нет никакого способа, чтобы сделать статический IEnumerable есть?

Смежные вопросы