明确地调用事件

时间:2014-09-02 13:50:40

标签: c# events

是否可能以某种方式触发属于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();

3 个答案:

答案 0 :(得分:3)

不,你不能直接从另一个类调用它。这就是事件的重点(封装)。

你需要一个辅助方法

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关键字并使用委托。这并不妨碍你这样做。(我不推荐)

答案 1 :(得分:1)

没有。事件的整个目的是包装委托,同时明确禁止除添加/删除事件处理程序之外的所有访问权限。 event关键字专门用于防止除声明事件的类以外的任何类调用它。

答案 2 :(得分:0)

简短回答:不。

更长的答案:引擎盖下没有"事件"不同于真实物体的代表。事件只是方便两种方法(添加和删除处理程序)和myEvntHandler类型的私有 隐藏字段。

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

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

  1. 将活动移至界面
  2. 在真实班级中实施界面
  3. 创建一个测试类,该类也实现了接口并添加了" RaiseEvent"方法。
  4. 将界面注入待测单元