显式调用事件
本文关键字:事件 调用 | 更新日期: 2023-09-27 18:20:17
是否有可能以某种方式触发属于C#中另一个类的事件,例如:
class foo
{
public delegate void myEvntHandler();
public event myEvntHandler onTesting;
.
.
.
}
class Main
{
public static void Main()
{
foo obj = new foo();
...
obj.onTesting.Invoke();
}
}
在这个示例中,我的意思是:obj.onTesting.Invoke()
不,您不能直接从另一个类调用它。这就是事件(封装)的意义所在。
你需要一个辅助方法
class foo
{
public delegate void myEvntHandler();
public event myEvntHandler onTesting;
public void RaiseEvent()
{
if(onTesting !=null)
onTesting ();
}
}
然后调用RaiseEvent
方法而不是
class Main
{
public static void Main()
{
foo obj = new foo();
...
obj.RaiseEvent();
}
}
如果您需要以您所做的方式调用它,只需删除event
关键字并使用委托即可。这并不妨碍你这样做。(我不建议这样做)
否。事件的全部目的是包装委托,同时明确禁止除添加/删除事件处理程序之外的所有访问权限。event
关键字专门用于防止除声明事件的类之外的任何类调用它。
简短回答:不。
更长的答案是:在引擎盖下,没有什么"事件"不同于真实对象的代表。事件只是为两个方法(添加和删除处理程序)和myEvntHandler类型的private隐藏字段提供了便利。
从逻辑上讲,从类外引发事件是没有意义的:事件的全部意义在于,当类检测到某个触发器时,它由类引发。
如果你只是想让它引发一个事件来测试另一个添加了处理程序的类,那么正确的方法是:
- 将事件移动到接口
- 在真实类中实现接口
- 创建一个同样实现接口的测试类,并将您的"RaiseEvent"方法添加到其中
- 将接口注入测试单元