Получить общедоступные поля? - PullRequest
1 голос
/ 10 октября 2010

У меня есть структура, определенная следующим образом

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

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

Ответы [ 2 ]

7 голосов
/ 10 октября 2010
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>, где ключом является имя поля, а значением является значение поля (в виде символа).

Обновление : Добавлено предложение where на основе комментариев и предложения @ nasufara, а также добавлена ​​проверка IsLiteral на основе @Jeff M's.

0 голосов
/ 10 октября 2010
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 = ' ';
}

Редактировать: Бла ... нет способа сделать статический IEnumerable есть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...