2010-06-08 10 views
11

Say, par exemple, j'ai cette classe simple:Get PropertyInfo de propriété au lieu du nom

public class MyClass 
{ 
    public String MyProperty { get; set; } 
} 

La façon d'obtenir le PropertyInfo pour MyProperty serait:

typeof(MyClass).GetProperty("MyProperty"); 

Cette suce!

Pourquoi? Facile: il se casse dès que je change le nom de la propriété, il a besoin de beaucoup de tests dédiés pour trouver chaque endroit où une propriété est utilisée ainsi, les arbres de refactoring et d'utilisation sont incapables de trouver ce type d'accès.

N'y a-t-il aucun moyen d'accéder correctement à une propriété? Quelque chose, qui est validé lors de la compilation?
J'aimerais une commande comme ceci:

propertyof(MyClass.MyProperty); 
+3

Ça empire. Si vous observez WPF, vous remarquerez qu'il nécessite des noms de propriété de chaîne pour la liaison de données et également lors de l'implémentation de INotifyPropertyChanged. Ce n'est pas maintenant un cas de coin pour les utilisateurs de Reflection, mais le cas général d'utilisation quotidienne. Je compte actuellement sur Resharper pour que les choses restent synchronisées. –

+0

Unitesting m'a aidé beaucoup ici, mais c'est à ce sujet ... – Enriquev

+0

Question connexe de débordement de pile avec des réponses plus détaillées: http://stackoverflow.com/questions/491429/how-to-get-the-propertyinfo-of-a- specific-property –

Répondre

2

Le projet Caliburn a une bonne mise en œuvre de ce vous cherchez à prendre soin des noms de propriété INotifyPropertyChanged.Vous pouvez adapter le code d'expression à ce que vous devez faire.Voir la classe Caliburn.Core.PropertyChangedBase

+0

Intéressant! Cela m'aide à comprendre la réponse de Jon Skeets. – Sam

-1

Le point de réflexion tout est de pouvoir accéder à des choses lors de l'exécution. Si nous supposons que votre opérateur fonctionnerait, vous avez déjà les informations de classe et donc la propriété, ce qui rend l'ensemble complètement inutile.

+0

J'ai déjà la propriété? Sans le nom dans le texte? Comment ça ?? – Sam

6

Le plus proche vous pouvez venir à l'heure actuelle est d'utiliser un arbre d'expression:

GetProperty<MyClass>(x => x.MyProperty) 

puis sucent le PropertyInfo dans GetProperty (que vous auriez à écrire). Cependant, c'est un peu fragile - il n'y a pas de garantie à la compilation que l'arbre d'expression est seulement un accès à la propriété. Une autre alternative est de garder les noms de propriété que vous utilisez quelque part qui peuvent être testés facilement, et s'en remettre à cela.

Fondamentalement, ce que vous voulez est l'opérateur infoof mythique qui a été parlé à plusieurs reprises par l'équipe C# - mais qui n'a pas fait la coupe jusqu'à :(

+0

Regarde intrigant - mais comment j'écrirais GetProperty? Je ne suis même pas sûr * quoi * il est - une classe générique? Ou juste une méthode générique? infoof sons adorables, dommage que ce ne soit pas (encore) – Sam

0

Depuis que cette question a été postée, C# 6 a été publié avec le nameof operator, ce qui permet d'accéder à une propriété avec le code suivant:

Si vous renommez la propriété, ce code ne sera pas compilé (en fait, il le sera, puisque le changement de nom changera cette ligne de code si le renommer est fait correctement).

Questions connexes