Question

Dans

Était-ce utile?

La solution

Pour votre deuxième extrait de code au travail, NotifyPropertyChangedWrapper devrait certainement utiliser la réflexion (ou dynamic) pour générer une classe qui fournit une interface compatible avec Customer et met en œuvre la notification automatique de propriété. Il ne devrait pas y avoir de problèmes de liaison de données, mais il y aurait un peu de frais généraux.

Une mise en œuvre simplifiée qui utilise un objet dynamique pourrait ressembler à ceci:

public class NotifyPropertyChangedWrapper<T> 
    : DynamicObject, INotifyPropertyChanged
{
    private T _obj;

    public NotifyPropertyChangedWrapper(T obj)
    {
        _obj = obj;
    }

    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        result = typeof(T).GetProperty(binder.Name).GetValue(_obj);
        return true;
    }

    // If you try to set a value of a property that is
    // not defined in the class, this method is called.
    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        typeof(T).GetProperty(binder.Name).SetValue(_obj, value);
        OnPropertyChanged(binder.Name);
        return true;
    }

    // Implement OnPropertyChanged...
}

De toute évidence, tout code qui consomme un de ces objets perdrait toute sécurité de type statique. L'autre option est de générer une classe implémentant la même interface que la classe étant enveloppée. Il y a beaucoup d'exemples pour cela sur le web. La principale exigence est que votre Customer devrait soit être un interface ou il aurait besoin de toutes ses propriétés d'être virtuelle.

Autres conseils

Pour faire cela d'une manière générique (par exemple un seul morceau de code mise en œuvre INotifyPropertyChanged pour toute classe) utiliser un proxy. Il y a beaucoup de mises en œuvre autour de le faire avec Castle.DynamicProxy ou < a href = "http://www.google.com/search?hl=en&q=linfu+INotifyPropertyChanged" rel = "nofollow"> Linfu ou unité . Ces bibliothèques proxies ont un bon soutien dans des conteneurs IoC, par exemple DynamicProxy a une bonne intégration avec le château de Windsor et l'interception unité (ou quelque chose comme ça) a évidemment une bonne intégration avec le conteneur unité.

Je ne l'ai jamais utilisé, mais vous pouvez créer soi-disant quelque chose comme ceci en utilisant PostSharp .

Si vous êtes à la recherche d'une solution spécifique pour les objets liables création automatique que vous devriez regarder PropertyChanged.Fody (précédemment NotifyPropertyWeaver). Ce cours de mise en œuvre réécritures INotifyPropertyChanged pour inclure le code de notification. Il y a un exemple sur la page GitHub.

À mon avis, c'est plus propre que l'utilisation de la solution contenant du CIO proposé. Cependant, il est spécifique à la bibliothèque INotifyPropertyChanged liant donc n'est pas applicable en tant que solution générale, comme cela a été discuté dans votre question liée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top