2014-09-02 72 views
1

这有可能以某种方式来触发属于另一类在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();

+0

你会得到**的事件只能出现在左手侧+ =或 - = **错误 – Kowalski 2014-09-02 13:54:26

回答

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

+0

当然,这违背了使用的全部目的首先是一个事件。 – Servy 2014-09-02 13:56:15

+1

@Servy如果'RaiseEvent'方法除了举办活动之外别无其他,我同意你的看法。如果它有一些副作用并引发了事件,那么它并不能击败IMO的目的。 – 2014-09-02 13:58:05

+1

当然,重要的是当*做其他事情时*事件被触发。您不仅仅是单独开展活动,您会执行某些操作,并在该操作发生时触发事件。几乎所有的事件都是由于某个成员被调用而被解雇的,重点在于它不是*就是这样做的。 – Servy 2014-09-02 14:00:13

1

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

0

简短的回答:第

更长的答案:油烟机有没有这样的事,作为一个“事件”不像代表它们是真正的对象之下。事件只是为了方便两种方法(添加和删除处理程序)和私有隐藏类型为myEvntHandler的字段。

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

如果你只是希望它以测试增加了一个处理程序,然后按照正确的方法去另一个类引发一个事件是:

  1. 招事件的接口
  2. 实施接口在您的真实类
  3. 创建一个测试类,也实现了接口并添加您的“RaiseEvent”方法。
  4. 注入接口为您的被测单元