7
votes

Comment obtenez-vous un nom de propriété C # comme une chaîne avec réflexion?

Dupliqué possible:
C # - Comment obtenez-vous le nom d'une variable car il a été physiquement typé dans sa déclaration?

Je cherche un moyen d'obtenir un nom de propriété comme une chaîne afin que je puisse avoir une chaîne magique "fortement tapée". Ce que je dois faire, c'est quelque chose comme myclass.someproperty.getname () qui reviendrait "quelqueProperty". Est-ce possible dans c #?


0 commentaires

3 Réponses :


7
votes

Vous pouvez utiliser des expressions pour y parvenir assez facilement. Voir ce Blog pour un échantillon .

Cela le fait Donc, vous pouvez créer une expression via une Lambda et retirer le nom. Par exemple, la mise en œuvre inotifypropertychanged peut être retravaillée pour faire quelque chose comme: p> xxx pré>

afin de cartographier votre équivalent, à l'aide de la classe "refléte" référencée, vous feriez quelque chose comme: P>

string propertyName = Reflect.GetProperty(() => SomeProperty).Name;


1 commentaires

La syntaxe ici est un peu méchante, mais cela fait ce dont j'avais besoin. Merci!



2
votes

Vous pouvez obtenir une liste de propriétés d'un objet à l'aide de la réflexion.

MyClass o;

PropertyInfo[] properties = o.GetType().GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
);


0 commentaires

9
votes

Cette approche sera bien plus rapide que d'utiliser expression xxx

maintenant, vous pouvez l'appeler: xxx

Vous pouvez cacher des valeurs si vous avez besoin de plus de performances. Voir cette question en double Comment obtenez-vous le nom d'une variable tel qu'il a été physiquement typé dans sa déclaration?


5 commentaires

Meilleure réponse ici. Je ne veux pas boucle de propriétés, je veux obtenir un nom de propriété basé sur une propriété réelle. Utilisation du type anonyme avec la première propriété (seulement) étant celle que vous souhaitez que le nom est génial.


@Paul je ne suis pas le génie derrière elle. Deuxièmement, ce n'est pas très amical de refacteurs. Je veux dire si vous modifiez le nom de la propriété, le type anonyme préserve le nom d'origine. Dans ce cas, si vous changez quelqueProperty vers quelqueproperty1 , la classe anonyme passe à nouveau {quelqueproperty = quelqueproperty1} , qui imprimera "quelqueproperty" , au lieu du nom mis à jour "quelqueProperty1". Je vais le mentionner dans la réponse.


Zut. Je ne prévois jamais de changer de nom de propriété, mais si je le faisais, je voudrais que le refactoring le gère. Merci de me le faire savoir.


Cela échouera également si MyClass est nul au moment de l'exécution. Les approches d'expression réussiront. Dans la grande majorité des cas qui ne seront pas un problème, car vous obtiendriez l'exception de référence nulle ailleurs, mais il vaut probablement la peine d'être souligné.


@ Pedro77 Vous devez d'abord écrire la méthode d'extension d'une classe statique.