显式调用事件

本文关键字:事件 调用 | 更新日期: 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隐藏字段提供了便利。

从逻辑上讲,从类外引发事件是没有意义的:事件的全部意义在于,当类检测到某个触发器时,它由类引发。

如果你只是想让它引发一个事件来测试另一个添加了处理程序的类,那么正确的方法是:

  1. 将事件移动到接口
  2. 在真实类中实现接口
  3. 创建一个同样实现接口的测试类,并将您的"RaiseEvent"方法添加到其中
  4. 将接口注入测试单元