Frage

In

War es hilfreich?

Lösung

Für Ihren zweiten Code-Schnipsel zu arbeiten, NotifyPropertyChangedWrapper müßte sicherlich verwenden Reflexion (oder dynamic), eine Klasse zu erzeugen, die eine Schnittstelle kompatibel mit Customer und implementiert die automatische Eigenschaft Benachrichtigung zur Verfügung stellt. Es sollte all Datenbindung Probleme nicht, aber es wäre ein wenig Aufwand sein.

Eine vereinfachte Implementierung, die ein dynamisches Objekt verwendet wie folgt aussehen könnte:

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

Offensichtlich jeder Code, dass verbraucht eines dieser Objekte würde jede statische Typ Sicherheit verlieren. Die andere Möglichkeit ist, eine Klasse der Umsetzung die gleiche Schnittstelle zu erzeugen, wie die Klasse eingewickelt werden. Es gibt viele Beispiele dafür auf dem Netz. Die wichtigste Voraussetzung ist, dass Ihr Customer haben würde entweder ein interface oder wäre es alle seine Eigenschaften müssen virtuell sein.

Andere Tipps

Um dies zu tun in allgemeiner Weise (das heißt ein einzelnes Stück Code Umsetzung INotifyPropertyChanged für jede Klasse) einen Proxy verwenden. Es gibt viele Implementierungen um dies zu tun mit Castle.DynamicProxy oder < a href = "http://www.google.com/search?hl=en&q=linfu+INotifyPropertyChanged" rel = "nofollow"> Linfu oder Einheit . Diese Proxy-Bibliotheken haben eine gute Unterstützung in IoC-Container, zum Beispiel Dynamic gute Integration mit Schloss Windsor und Unity Interception hat (oder was auch immer es heißt) hat offensichtlich eine gute Integration mit dem Unity-Container.

Ich habe es nie benutzt, aber man kann angeblich so etwas wie dies schafft mit Postsharp .

Wenn Sie sich für eine bestimmte Lösung für die automatische Erzeugung von bindbare Objekte suchen Sie unter PropertyChanged.Fody (zuvor NotifyPropertyWeaver). Dies schreibt Klassen INotifyPropertyChanged Durchführung des Benachrichtigungscode enthalten. Es ist ein Beispiel auf der GitHub-Seite.

Meiner Meinung nach ist dies ordentlicheres als mit der vorgeschlagenen IOC-Container-Lösung. Es ist jedoch eine Bibliothek spezifisch INotifyPropertyChanged Bindung, um eine allgemeine Lösung nicht anwendbar ist, wie es in Ihrer verknüpften Frage diskutiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top