2010-10-10 7 views
1

J'ai un struct défini comme celui-ciObtenez les champs publics?

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

Je veux utiliser la réflexion pour obtenir une liste de toutes les valeurs des champs public const char dans la struct (aussi précis que possible). Comment puis je faire ça?

Répondre

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

Renvoie une Dictionary<string, char> où la clé est le nom du champ, et la valeur est la valeur du champ (comme un caractère).

Mise à jour: Ajout de la clause where basée sur les commentaires et la suggestion de @ nasufara, et ajout de IsLiteral vérification basée sur @Jeff M's.

+0

Vous ne voulez certainement pas passer en "null"? Ou est-ce autorisé parce que leur const? Vous pouvez faire mieux en utilisant 'GetFields (BindingFlags.Public)' non? Pouvez-vous le limiter aux champs 'char'? – mpen

+0

@Mark, 'BindingFlags.Public' est la valeur par défaut, donc vous n'avez pas besoin de le passer. Et vous passez toujours la valeur null pour les champs 'const' ou' static' (puisque l'argument fait référence à une * instance * dont il n'y en a pas). –

+2

L'insertion d'un '.Where (x => x.FieldType == typeof (char))' entre '.GetFields()' et '.ToDictionary (...)' devrait le limiter aux caractères. – 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: Blah ... il n'y a pas moyen de faire un IEnumerable statique est là?

Questions connexes