2012-03-02 21 views
0

クラスのインスタンスXは、同じクラスのインスタンスYの変更イベントに登録されます。送信者をeventargとして送信するには

Yが変更された場合はXを更新したいが、クラス全体にstaticキーワードを使用したくない。 eventargsでイベントの受信者を送信する方法はありますか?

ここでは、問題がどこにあるのかを示すNUnitテストのコード例を示します。コンパイルして実行しました。 2つのテストはプログラミングを検証するだけです。失敗したテストは私の問題を示しています。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using NUnit.Framework; 

namespace Eventtest 
{ 
    public class DependencyChain 
    { 
     public static int demonstrationcount = 0; 

     private String hiddenstring = ""; 
     public String visiblestring 
     { 
      get { return hiddenstring; } 
      set 
      { 
       hiddenstring = value; 
       NotifyOnStringChanged(); 
      } 
     } 

     private void NotifyOnStringChanged() 
     { 
      if (changed != null) 
      { 
       changed(this, EventArgs.Empty); 
      } 
     } 

     public EventHandler changed; 

     private EventHandler Observer = new EventHandler((o, e) => { 
      DependencyChain sender = (o as DependencyChain); 
      demonstrationcount++; 
      //THE FOLLOWING DOES NOT WORK SINCE "this" IS NOT STATIC 
      //DependencyChain recipient = this; 
      //recipient.visiblestring = sender.visiblestring; 
     }); 

     public DependencyChain(string initialstring) 
     { 
      this.visiblestring = initialstring; 
     } 

     public DependencyChain(DependencyChain other) 
     { 
      this.visiblestring = other.visiblestring; 
      other.changed += Observer; 
     } 

     public override string ToString() 
     { 
      return visiblestring; 
     } 

    } 

    [TestFixture] 
    class Eventtest 
    { 
     [SetUp] 
     public void ResetStaticCounter() 
     { 
      DependencyChain.demonstrationcount = 0; 
     } 

     [Test]//PASS 
     public void ShouldInitialiseAndCopyValues() 
     { 
      DependencyChain Y = new DependencyChain("initial"); 
      DependencyChain X = new DependencyChain(Y); 
      Assert.AreEqual(X.ToString(), Y.ToString()); 
     } 

     [Test]//PASS 
     public void ShouldCallObserverOnChange() 
     { 
      DependencyChain Y = new DependencyChain("initial"); 
      DependencyChain X = new DependencyChain(Y); 
      Assert.AreEqual(0, DependencyChain.demonstrationcount); 
      Y.visiblestring = "changed"; 
      Assert.AreEqual(1, DependencyChain.demonstrationcount); 
     } 

     [Test]//FAIL 
     public void ShouldChangeStringOnChange() 
     { 
      DependencyChain Y = new DependencyChain("initial"); 
      DependencyChain X = new DependencyChain(Y); 
      Y.visiblestring = "changed"; 
      Assert.AreEqual(X.ToString(), Y.ToString()); 
     } 
    } 
} 

答えて

1

私はあなただけDependencyChainのコンストラクタにObserverの初期化を移動するために持っていると思うので、あなたがthisをキャプチャすることができます。

+0

これはうまくいきました。コードのコメントを外し、コンストラクタのメソッドと呼ばれるメソッドに移動しました。ありがとう – Johannes

+0

よかった、良い。また、evtハンドラをラムダの代わりに「通常の」メソッドとして記述することもできます。 –

関連する問題