2010-04-26 8 views
7

Formular mit Build your own MVVM Ich habe den folgenden Code, der uns typsicher NotifyOfPropertyChange Anrufe können:typsichere NotifyPropertyChanged Linq Ausdrücke

public void NotifyOfPropertyChange<TProperty>(Expression<Func<TProperty>> property) 
{ 
    var lambda = (LambdaExpression)property; 
    MemberExpression memberExpression; 
    if (lambda.Body is UnaryExpression) 
    { 
     var unaryExpression = (UnaryExpression)lambda.Body; 
     memberExpression = (MemberExpression)unaryExpression.Operand; 
    } 
    else memberExpression = (MemberExpression)lambda.Body; 
    NotifyOfPropertyChange(memberExpression.Member.Name); 
} 

Wie funktioniert dieser Ansatz auf Standard einfache Strings vergleichen performancewise nähern? Manchmal habe ich Eigenschaften, die sich sehr häufig ändern. Kann ich diesen typsicheren Ansatz verwenden? Nach einigen ersten Tests scheint es einen kleinen Unterschied zu machen. Wie viel CPU-Speicherlast kann dieser Ansatz möglicherweise induzieren?

+0

Diese Diskussion könnte Sie interessieren: [** Best Practices: Wie implementieren Sie INotifyPropertyChanged richtig? **] (http://compositeextensions.codeplex.com/Thread /View.aspx?ThreadId=53731) – jbe

Antwort

5

Wie sieht der Code aus, der dies auslöst? Ich vermute, es ist so etwas wie:

NotifyOfPropertyChange(() => SomeVal); 

die implizit ist:

NotifyOfPropertyChange(() => this.SomeVal); 

, die eine Erfassung von this tut, und ziemlich viel bedeutet, dass der Ausdruck Baum muss konstruiert werden (mit Expression.Constant) jedes Mal von Grund auf neu. Und dann parst du es jedes Mal. Der Overhead ist also definitiv nicht trivial.

Ist es zu viel obwohl? Das ist eine Frage, die nur Sie beantworten können, mit Profiling und Wissen über Ihre App. Es wird für viele MVC-Verwendung als OK angesehen, aber das nennt es (allgemein) nicht in einer lang andauernden engen Schleife. Sie müssen im Grunde gegen ein gewünschtes Leistungsziel profilieren.

+0

Ihre Annahme, wie der Anruf aussieht, ist korrekt. – bitbonk

+0

Perf-Vergleiche http://www.pochet.net/blog/2010/06/25/inotifypropertychanged-implementations-an-overview/ – Simon

+0

@Simon natürlich in C# 5 die neuen Anrufer-Namen-Attribute machen es fast eine redundante Frage –

0

ich die folgende Methode in einer Basisklasse verwenden Umsetzung INotifyPropertyChanged, und es ist so einfach und bequem:

public void NotifyPropertyChanged() 
    { 
     StackTrace stackTrace = new StackTrace(); 

     MethodBase method = stackTrace.GetFrame(1).GetMethod(); 

     if (!(method.Name.StartsWith("get_") || method.Name.StartsWith("set_"))) 
     { 
      throw new InvalidOperationException("The NotifyPropertyChanged() method can only be used from inside a property"); 
     } 

     string propertyName = method.Name.Substring(4); 

     RaisePropertyChanged(propertyName); 
    } 

Ich hoffe, dass Sie es auch nützlich finden. :-)

+1

Bitte nicht die gleiche Antwort über mehrere Fragen spammen. Wenn die Frage ein Duplikat ist, hinterlasse einen Kommentar, der dies angibt (oder markiere, ob du genug Ansehen hast). Wenn es sich nicht um ein Duplikat handelt, passen Sie Ihre Antwort auf die gestellte Frage an. –

1

Wie über den Defacto-Standard

if (propName == value) return; 
propName = value; 
OnPropertyChanged("PropName"); 

und dann erstellen Sie ein benutzerdefiniertes Tool, das die Code-Datei überprüft und refactors nach dieser Norm. Dieses Tool könnte eine Pre-Build-Aufgabe sein, auch auf dem Build-Server. Einfach, zuverlässig, erfüllt.

0

Typesafe und kein Leistungsverlust: NotifyPropertyWeaver-Erweiterung. Es fügt alle Benachrichtigungen automatisch vor dem Kompilieren hinzu ...

Verwandte Themen