2009-11-02 15 views
6

これは、属性について学習していて、INotifyPropertyChangedをあまりにも多く使用していたため、考えていただけです。ちょうどIdeaで、これについていくつかの意見を聞きたいと思います。属性の使用... INotifyPropertyChanged

INotifyPropertyChangedは、ほとんどの場合、同じパターンで使用されるため、プロパティの名前でイベントを起動するメソッドと同じように、コンパイル時には、それは属性と自動プロパティを使用して設計できますか?コンパイラはPropertyChangedイベントへの呼び出しを追加する必要があることを知りますか?我々は

public class DemoCustomer : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    private string companyNameValue = String.Empty; 
     ... 
} 

代わりのプロパティ

public string CompanyName 
    { 
     get 
     { 
      return this.companyNameValue; 
     } 

     set 
     { 
         if (value != this.companyNameValue) 
         { 
          this.companyNameValue = value; 
          NotifyPropertyChanged("CompanyName"); 
         } 
     } 
    } 

を宣言....クラスを持っている場合、我々はそれが必要であることを、この属性により、コンパイラに指示することができる場合 だから我々はこのような何かを行うことができます新しい値が前の

[NotifyPropertyChanged] 
public string CompanyName 
{ 
    get;set; 
} 

と異なる場合プロパティの名前を持つにPropertyChangedへの呼び出しを生成する我々はまだトンでコーディング保つことができます属性を使用していないときのいくつかのカスタムビヘイビアのための古い方法です。

答えて

8

することはできdo thisJason BockDimecastを見ることができますが、私はいつでもすぐにそれがコアコンパイラになるだろうとは思いません。

4

このような考え方は、アスペクト指向プログラミング(AOP)と呼ばれています。 MonoのCecilを使用してポストビルドアクションを追加すると、その属性を持つプロパティを通過し、プロパティの動作を変更し、適切に動作する新しくコンパイルされたアセンブリを吐き出すことができます。あなたはPostSharpで 『Leveraging Cecil to inject code into your Assemblies

+0

非常に良い読書..ありがとうございました...私はポストシャープを使い始めました...それが私が他の答えを指している理由です。しかし、これも同様に便利です。 – jmayor

7

誰もがこのスレッドで発生し、C#5(VS 2012+、.NET 4.5+)を使用している場合。この場合はCallerMemberNameAttributeで「もっと簡単に」実行できます。この属性は文字列パラメータに適用され、デフォルト値usが使用されたとき(つまりwhenと引数が渡されないとき)、コンパイラは呼び出し元のメソッド/プロパティの名前を渡します。 INotifyPropertyChangedの実装が面倒ではありません。たとえば:

public class MyClass 
{ 
    private string myProperty; 

    public string MyProperty 
    { 
     get { return myProperty; } 
     set 
     { 
      myProperty = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

だから、あなただけのイベントを送信するために、各セッターでOnPropertyChanged()を必要とプロパティ名用のハードコードされた文字列に対処する必要はありません。