通过传递方法简化委托的创建?

时间:2014-06-05 18:22:09

标签: c# events delegates encapsulation object-oriented-analysis

是否有某种方法可以简化代理的创建,以便于读取编码?这是我希望能够做到的一个例子,我想知道是否有办法:

public delegate void MyDelegate(Object sender, EventArgs e);

public class ClassWithEvent
{
    public event MyDelegate MyEvent;

    public ClassWithEvent() { }

    public void RegisterForEvent(Method)
    {
        MyEvent += new MyDelegate(Method);
    }

    public void Trigger()
    {
        if(MyEvent != null)
        {
            MyEvent(this, null);
        }
    }

}

public class ClassToRegister
{
    public ClassWithEvent MyEventClass = new ClassWithEvent();

    public ClassToRegister() { }

    public void RegisterMe()
    {
        MyEventClass.RegisterForEvent(MyEventMethod);

        MyEventClass.Trigger();
    }

    public void MyEventMethod(Object sender, EventArgs e)
    {
        Console.Writeline("Hello there!");
    }
}

尝试尝试这一点背后的观点是为了封装。我假设发起事件的类本质上是访问它的类的黑盒子。由于这是我可以看到的最优选的面向对象的流程,我想知道是否有这样做的方法,或者如果没有注册类具有一些知识的话,根本没有办法做到这一点它必须创建的代表。

1 个答案:

答案 0 :(得分:1)

是的,从某种意义上说,你不需要一个命名代表来实现这个目标。相反,您可以在您的案例中使用通用委托ActionAction<object, EventArgs>)。 Action委托返回void,并且具有与泛型类型参数匹配的参数。

通常情况下,您只需直接公开事件(避免使用&#34;注册&#34;功能),因此无论如何都不用担心这部分内容。

如果您使用它,您的代码将如下所示:

public class ClassWithEvent
{
    public event Action<object, EventArgs> MyEvent;

    public ClassWithEvent() { }

    public void RegisterForEvent(Action<object, EventArgs> Method)
    {
        MyEvent += Method;
    }

    public void Trigger()
    {
        if(MyEvent != null)
        {
            MyEvent(this, null);
        }
    }

}

public class ClassToRegister
{
    public ClassWithEvent MyEventClass = new ClassWithEvent();

    public ClassToRegister() { }

    public void RegisterMe()
    {
        MyEventClass.RegisterForEvent(MyEventMethod);

        MyEventClass.Trigger();
    }

    public void MyEventMethod(Object sender, EventArgs e)
    {
        Console.Writeline("Hello there!");
    }
}