12
votes

Obtenez des champs avec une réflexion

Je veux obtenir tous les champs qui ont des valeurs nulles, mais je ne reçois même aucun champ: xxx

et j'ai une classe: xxx

mais quand je vient à xxx

alors je reçois 0 champs, il devrait trouver 2 champs.

est Type.getType (). Getfields () mal à utiliser? Ou suis-je envoyé dans la mauvaise classe à la classe de base?


0 commentaires

3 Réponses :


2
votes

value1 et value2 dans vos paramètres Les classes sont des propriétés plutôt que des champs, vous devez donc utiliser getProperties () pour y accéder.

(en utilisant le {get; set;} Syntaxe indique au compilateur que vous souhaitez une propriété, mais qu'il devrait générer le obtenir et définir pour vous, ainsi qu'un champ privé caché contenant les données.)


0 commentaires

26
votes

Type.getfields méthodes renvoie tous les champs publics. Les champs que le compilateur autogenerate pour vous êtes privé, vous devez donc spécifier correctement BindingFlags CODE>.

type.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic)


0 commentaires

2
votes

Les champs générés par le compilateur correspondant aux propriétés de votre classe ont le compilergénera attribut. De plus, le compilateur générera obtenir code> et définir les méthodes de gestion de ces champs, en fonction de la déclaration de votre propriété.

de compilergenerateaTribute strong> documentation MSDN : P>

distingue un élément généré par le compilateur d'un élément généré par l'utilisateur. Cette classe ne peut pas être héritée. P> blockQquote>

Le nom de ces champs a le format k_backingfield code>, les méthodes définissez code> et obtenez code> Les noms ont le format SET_PROPERTYNAME CODE> et GET_PROPERTYNAME CODE> Lorsque la propriétéName est le nom de la propriété. p>

Par exemple, votre classe Paramètres code> est compilé comme suit: P>

public IEnumerable<FieldInfo> GetFields(Type type)
{
    return type
        .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
        .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null);
}


0 commentaires