是否有某种方法可以简化代理的创建,以便于读取编码?这是我希望能够做到的一个例子,我想知道是否有办法:
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!");
}
}
尝试尝试这一点背后的观点是为了封装。我假设发起事件的类本质上是访问它的类的黑盒子。由于这是我可以看到的最优选的面向对象的流程,我想知道是否有这样做的方法,或者如果没有注册类具有一些知识的话,根本没有办法做到这一点它必须创建的代表。
答案 0 :(得分:1)
是的,从某种意义上说,你不需要一个命名代表来实现这个目标。相反,您可以在您的案例中使用通用委托Action
(Action<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!");
}
}