Ce doit être un événement un peu courant pour modifier le nom d'une propriété et s'attendre à ce que la fonctionnalité de renommée dans Visual Studio de prendre soin de tout le changement de renommage nécessaire, à l'exception du nom de propriété de l'événement de l'état de propriété inotifyPropertychandesd. Y a-t-il un meilleur moyen de l'obtenir fortement dactylographié afin que vous n'ayez pas besoin de vous rappeler de le renommer manuellement? P>
7 Réponses :
Pas une réponse à votre question, mais si vous avez un clic droit-> refactor-> renommer une propriété, elle peut renommer des chaînes correspondantes également, y compris les chaînes correspondant à votre nom de votre propriété. p>
Ouais, ça peut être un peu dangereux. p>
Même renommer dans les commentaires est dangereux. J'ai foiré un tas de documentation XML dans un projet assez important en supposant que cette fonctionnalité limiterait la portée aux commentaires sur / dans l'élément de code renommé.
the PropertyChangeDeventargs ne prend qu'une seule constructeur, qui nécessite le nom de la propriété comme une chaîne. Donc, essentiellement non-utilité inotifypropertychanged signifie qu'à un certain niveau, que ce soit haut ou bas dans votre architecture, vous devrez travailler avec une chaîne et un renommage manuel. p>
Edit: Il n'y a pas de nom code> / Il existe un moyen de le faire en utilisant des expressions Lambda dans .NET 3.5 (et analyse de l'arbre d'expression), mais en réalité, cela ne vaut pas la peine aérien. Pour l'instant, je voudrais juste rester avec des chaînes (et des tests unitaires si vous êtes déterminé à ne pas le casser). P> Nomof code> est arrivé en C # 6. YAY!
infoof code> etc. C'est beaucoup discuté, mais c'est ce que c'est. P>
Je vais probablement juste coller sur les cordes, mais pour des coups de pied, pourriez-vous donner un échantillon de code court sur la façon d'analyser l'arbre d'expression?
Pourquoi utilisez-vous Expression
P => P.NAME CODE> Au lieu de
Expression
() => nom code>?
Soit irait bien, mais la version telle que postée indique clairement que nous recherchons une propriété sur l'instance - pas seulement quelque chose de hasard.
Spécification de l'expression
Plus vrai! Maintenant, vous pouvez utiliser Nameof.
La solution la plus simple consiste à regarder la trace de la pile et à supprimer complètement toutes les références explicites à la propriété.
public String Name { get { return this.name; } set { if (value != this.name) { String propertyName = MethodBase.GetCurentMethod().Name.SubString(4); this.RaisePropertyChanging(propertyName); this.name = value; this.RaisePropertyChanged(propertyName); } } } private String name = null;
Cette solution est plus fragile que la simple définition du nom de la propriété en tant que chaîne.
Cela semble intéressant. Sans vérifier la documentation, cependant, je ne peux pas savoir à quoi ressemble l'appel à la sous-chaîne. GetMethod (). Nom renvoie quelque chose d'étrange?
Une propriété est mise en œuvre par deux méthodes. public mytype myproperty {obtenir; ensemble; } est implémenté comme vide public Set_Myproperty (valeur mytype) {} et public mytype get_myproperty (). Vous devez donc supprimer Set_ et Get_ du nom de la méthode retourné pour obtenir le nom de la propriété.
En théorie, vous pouvez utiliser MethodBase.getCurrentMethod (). Nom.Substring (4) à partir du setter de la propriété. Malheureusement, Google Search révèle que Il semble avoir un impact significatif sur la performance . Deux autres choses à considérer: p>
C # 5 semble avoir une solution. Avec un appelermembername code> attribut
qui peut être Utilisé avec des paramètres ( un exemple sur le net ).
(Exemple ajouté selon la demande / Commentaire)
Jetez un coup d'œil à cet article. weblogs.asp.net/ Dwahlin / Archive / 2009/07/07 / ... Si vous créez une classe de base qui implémente InotifyPropertychangned, puis de le dériver, vous pouvez peut-être l'utiliser.
Voir Stackoverflow.com/Questtions/1329138/... pour un compilateur vérifié de la mise en œuvre inotifyProperTychanged. Éviter d'avoir les noms de propriété comme une chaîne magique.