10
votes

Y a-t-il une bonne voie fortement typée de faire des événements de niveau de propriété en C #?

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?


3 commentaires

(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.


7 Réponses :


0
votes

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é.

Ouais, ça peut être un peu dangereux.


1 commentaires

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é.



-1
votes

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.


0 commentaires

8
votes

Edit: Nomof est arrivé en C # 6. YAY!


Il n'y a pas de nom / infoof etc. C'est beaucoup discuté, mais c'est ce que c'est.

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).


xxx

5 commentaires

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 > et P => P.NAME Au lieu de Expression > et () => nom ?


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 > sur la classe de la vue de votre base, ne permettra pas aux sous-classes d'augmenter ses propriétés. C'est pourquoi l'expression > est meilleure à cette fin.


Plus vrai! Maintenant, vous pouvez utiliser Nameof.



2
votes

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;


3 commentaires

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é.



1
votes

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:

  • JIT L'INLINUING peut avoir une incidence sur cela de manière inattendue. (Stackoverflow.com/questions/616779/CAN-I-Check-if-the-C-Compiler-Inlined-a-Method-Call)
  • En théorie, l'appel à MethodBase.getCurrentMethod () pourrait être de trivialement remplacé par le JIT au moment de l'exécution avec une instruction LDToken suivie d'un appel à la méthodebase.getMethodfromhandle (), qui serait très rapide. Je suppose que les utilisateurs n'ont tout simplement pas exprimé besoin de cela. (msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldtoken.aspx)
  • complètement mon opinion ici, mais je pense que ce serait bien d'avoir du champ de champ () et de la méthode d'operations () en C #. Je crois que cela améliorerait considérablement la fiabilité des outils d'analyse / de refactorisation de code dans des projets nécessitant cette capacité.

0 commentaires


6
votes

C # 5 semble avoir une solution. Avec un appelermembername attribut qui peut être Utilisé avec des paramètres ( un exemple sur le net ). XXX


0 commentaires