我如何将发件人作为eventarg进行传输

时间:2012-03-02 08:44:13

标签: c# events

类的实例X注册到同一类的实例Y的更改事件。

如果更改了Y,我想更新X,但我不想在整个类中使用static关键字。有没有办法在eventargs中传输事件的接收者?

下面是一些带有NUnit测试的示例代码,用于说明我的问题究竟在哪里。我编译并运行它。两个测试只是验证编程。失败的测试说明了我的问题。

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 个答案:

答案 0 :(得分:1)

我认为您只需将Observer的初始化移至DependencyChain的构造函数,即可捕获this