2016-05-22 6 views
0

オブジェクトのプロパティの観察について質問があります。例えばC# - 後でプロパティの実装を実装する

、私はこのようなクラスを持っている:

public class MyProperties 
{ 
    public string Prop1 { get; set; } 
    public int Prop2 { get; set; } 
} 

私の願いはMyPropertiesの特性の一つが変更された場合に通知を取得することです。私はMyPropertiesで任意のコードを変更する必要はありません

//I have an instance 
MyProperties Prop = new Myproperties(); 
//And add a listener to the properties 
Prop.Prop1.AddNotification(APropertyChanged); 
Prop.Prop2.AddNotification(APropertyChanged); 

//I have a eventhandler in my code 
public void (object Sender, EventArgs e) 
{ 
    //Sender is the Property 
} 

:マイビジョンはこのようなものです。このような何かを達成する方法はありますか?それともこの考えは全く馬鹿ですか?

答えて

0

ここには私の解決です。 @ romain-agaのおかげです。

Fody PropertyChangedは、コンパイル時にプロパティのコードを変更できるようにします。私はクラスがある場合:

public class MyProperties 
{ 
    public string Prop1 { get; set; } 
    ... 
} 

をFodyこのコードにコンパイルします:反射によって

public class MyProperties 
{ 
    string prop1; 
    public string Prop1 
    { 
     get { return prop1; } 
     set 
     { 
      if (value != prop1) 
      { 
       prop1 = value; 
       OnPropertyChanged("Prop1"); 
      } 
     } 
    } 
    ... 
} 

を、生成さPropertyChangedイベントにメソッドを追加することが可能である:

EventInfo Event = typeof(MyProperties).GetEvent("PropertyChanged"); 
MethodInfo Method = //The methode of the handler you want 
Delegate Handler = Delegate.CreateDelegate(Event.EventHandlerType, this, Method); 
Event.AddEventHandler(IntanceOfMyProperties, Handler); 
1

クラスMyPropertiesがINotifyPropertyChangedインターフェイスを実装している場合は、PropertyChangedイベントを発生させることができます。それ以外の場合は、いくつかのフレームワーク(私はアスペクト指向のプログラミングフレームワークが助けることができると思う)を見なければならないでしょう。あなたはINotifyPropertyChangedの

を実装する必要が

+0

ます。https: //github.com/Fody/Fody –

+0

とても面白いですね、thx :) –

+0

Fody PropertyChangedはよく見えます! – Fruchtzwerg

0

は、あなたがしたい場合は、一般的にWPF MVVMで使用

そのをINotifyPropertyChangedのを実装することができ https://msdn.microsoft.com/fr-fr/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

+0

あなたの答えをありがとう。私は自分のクラスのコードを変更することができません。ですから、私はINotifyPropertyChangedを実装することはできません。そこには別の方法がありますか? – Fruchtzwerg

+0

最も簡単な方法は、クラスMyPropertyから派生し、それにINotifyPropertyChangedを実装する他のクラスを作成することです – Eidivandi

0

を見てみましょう。 (VS2015でサポートされている)C#6の新しい構文がある)

private string _prop1; 
private int _prop2; 

public string Prop1 
{ 
    get 
    { 
     return _prop1; 
    } 
    set 
    { 
     _prop1 = value; 
     RiseEvent(nameof(Prop1),Prop1); 
    } 
} 

public int Prop2 
{ 
    get 
    { 
     return _prop2; 
    } 
    set 
    { 
     _prop2 = value; 
     RiseEvent(nameof(Prop2),Prop2); 
    } 
} 

protected void RiseEvent(string propertyName, object propertyValue) 
{ 
    //---Code that uses the propertyName and propertyValue and rises an event as your choice 
} 

がNameOf(:

は、私がこのような何かをするだろう...とにかく

(あなただけのイベントハンドラを自分で書くことができます) 古いバージョンを使用している場合は、他の方法でこれを行うことができます(私にコメントしてください)。

+0

ありがとうございました。私は自分のクラスのコードを変更することができません。ですから、私はINotifyPropertyChangedを実装することはできません。そこには別の方法がありますか?http://stackoverflow.com/questions/:あなたのクラスは、プロパティのインタフェースを持っている場合 – Fruchtzwerg

+0

あなたはクラスのプロキシを必要とする、 あなたは (見つけ、それについて話して、すでに誰か.NETでのRealProxyクラスに動的にそれを行うことができます15733900/dynamic-creating-a-proxy-class) それ以外の場合は、自分でクラスをラップすることができます – greenberet