2011-10-20 2 views
22

Peut-on m'expliquer pourquoi la méthode GetProperties ne retournerait pas de valeurs publiques si la classe est configurée comme suit.La méthode GetProperties de System.Reflection ne retourne pas de valeurs

public class DocumentA 
{ 
    public string AgencyNumber = string.Empty; 
    public bool Description; 
    public bool Establishment; 
} 

Je suis en train d'installer une méthode simple de test unitaire pour jouer avec

La méthode est la suivante et il a toutes les déclarations et approprié à l'aide des références.

Tout ce que je fais appelle ce qui suit, mais il retourne 0

PropertyInfo[] pi = target.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

Mais si la configuration de la classe I avec les membres privés et des propriétés publiques, il fonctionne très bien.

La raison pour laquelle je n'ai pas configuré la classe à l'ancienne était parce qu'elle a 61 propriétés et que cela augmenterait mes lignes de code pour au moins tripler cela. Je serais un cauchemar de maintenance.

+2

C'est un peu évident, la classe n'a aucune propriété. Seulement les champs. Le cauchemar a commencé quand tu as laissé la classe exploser comme ça. L'utilisation des champs publics coûte plus de sommeil. –

Répondre

44

Vous n'avez déclaré aucune propriété - vous avez déclaré champs. Voici ce code similaire avec des propriétés:

public class DocumentA 
{ 
    public string AgencyNumber { get; set; } 
    public bool Description { get; set; } 
    public bool Establishment { get; set; } 

    public DocumentA() 
    { 
     AgencyNumber = ""; 
    } 
} 

Je vous conseille vivement d'utiliser les propriétés comme ci-dessus (ou peut-être avec les organismes plus restreints) au lieu de simplement changer d'utiliser Type.GetFields. Les champs publics violent l'encapsulation. (Les propriétés mutables publiques ne sont pas géniales sur le front d'encapsulation, mais au moins elles donnent une API, dont l'implémentation peut être modifiée ultérieurement.)

+0

Je suis entièrement d'accord avec vous sur l'utilisation des propriétés à la place des champs. Je ne connaissais pas la syntaxe correcte. Je déclare normalement les champs privés et les getters et setters publics. Mon problème était que je pensais utiliser des propriétés alors qu'en fait il me manquait {get, set}. Merci pour la clarification. – gsirianni

+0

Cette réponse m'a vraiment aidé –

4

Parce que la façon dont vous avez déclaré votre classe maintenant utilise Fields. Si vous voulez accéder aux champs par réflexion vous devez utiliser Type.GetFields() (voir Types.GetFields Méthode 1)

Je ne sais pas quelle version de C# vous utilisez mais la syntaxe de la propriété a changé en C# 2 à ce qui suit:

public class Foo 
{ 
    public string MyField; 
    public string MyProperty {get;set;} 
} 

Cela ne réduirait-il pas la quantité de code?

+0

Merci pour votre réponse. Je viens d'avoir ma syntaxe brouillée. Normalement, je ne déclare pas les propriétés de cette façon.La plupart du tiem j'ai des propriétés publiques avec des champs privés correspondants. – gsirianni

+2

Mais pourquoi? L'utilisation de la syntaxe de la main courte compile à la même IL. Le compilateur génère le champ backend pour vous. Vous avez seulement besoin de la syntaxe plus élaborée quand vous voulez faire un autre traitement dans le getter ou le setter. –

0

Comme mentionné, ce sont des champs et non des propriétés. La syntaxe de la propriété serait:

public class DocumentA { 
    public string AgencyNumber { get; set; } 
    public bool Description { get; set; } 
    public bool Establishment { get; set;} 
} 
1

Je vois ce fil est déjà quatre ans, mais pas moins je n'étais pas satisfait des réponses fournies. OP devrait noter que OP fait référence à Fields not Properties. Pour réinitialiser dynamiquement tous les champs (preuve d'expansion) essayer:

/** 
* method to iterate through Vehicle class fields (dynamic..) 
* resets each field to null 
**/ 
public void reset(){ 
    try{ 
     Type myType = this.GetType(); //get the type handle of a specified class 
     FieldInfo[] myfield = myType.GetFields(); //get the fields of the specified class 
     for (int pointer = 0; pointer < myfield.Length ; pointer++){ 
      myfield[pointer].SetValue(this, null); //takes field from this instance and fills it with null 
     } 
    } 
    catch(Exception e){ 
     Debug.Log (e.Message); //prints error message to terminal 
    } 
} 

Notez que GetFields() n'a accès à des champs publics pour des raisons évidentes.

+0

Cette réponse répond à la question initiale sur les champs, même si l'auteur utilisait par erreur GetProperties() sur des champs. Je vous remercie! –

Questions connexes