2012-12-05 73 views
2

我可以直接將事件直接連接到c#中的另一個事件嗎?還是有必要編寫一個物理方法來提高一個事件,以便您可以反射地將它連接到另一個事件?直接將事件直接連接到另一個事件

我想我需要使用GetRaiseMethod(),所以我不會這樣做,但文檔說c#不會生成一個提升方法。

如果我剛纔問的問題似乎完全偏離了我想要做的事情,那麼請幫助我走上正軌。基本上我只想反思地看兩個事件,並且有一個向前。

+0

我不完全明白你的意思。你能提供你想看到的工作的非工作示例代碼嗎? – Bobson

+1

@Bobson看到我的答案爲一個工作示例 –

回答

0

這就是我一直在尋找:

public event Action evt 

public void RaiseEvent() 
{ 
    var type = GetType(); 
    var fld = type.GetField("evt", BindingFlags.NonPublic | BindingFlags.Instance); 
    var fldValue = (MulticastDelegate)fld.GetValue(this); 
    fld.DynamicInvoke(); 
} 
3

假設你有一些事件

class A 
{ 
    public event EventHandler<MyEventArgs> MyEvent; 
} 

和其他一些事件

class B 
{ 
    public event EventHandler<MyEventArgs> MyOtherEvent; 

和方法,以提高該事件

protected void OnMyOtherEvent(MyEventArgs e) 
    { 
     var handler = MyEvent; 
     if (handler != null) 
      handler(this, e); 
    } 

那麼你就可以提高MyOtherEvent每當MyEvent上升如下:

public B(A a) 
    { 
     a.MyEvent += (sender, e) => OnMyOtherEvent(e); 
    } 
} 

請注意,你不能簡單地將MyOtherEvent委託添加到MyEvent活動,爲更多的MyOtherEvent代表可以在事後添加。所以你需要一些方法。

+0

謝謝。我試圖用win表單做一些MVC風格的編程,但是在頂層我只是想在我的視圖中聲明這些事件,並根據命名約定讓控制器連接了一些東西,這將是一個非常艱鉅的任務爲每個事件寫一個onEvent()方法。 –

+0

你的回答正是我想要做的,除了我只需要獲得委託並反思地調用它以避免必須物理編寫調用它的方法。看到我的答案,我終於想出瞭解決方案。 –

1

如果我剛纔問的問題似乎完全偏離了我想要做的事情,那麼請幫助我走上正軌。基本上我只想反思地看兩個事件,並且有一個向前。

事件不是直接「連線」的。您可以使用EventInfo.AddEventHandler將委託添加爲事件的新事件處理程序。這個代表可以是任何東西,包括引發另一個事件的方法。

您將需要一種方法,它將引發您的事件以及該方法的適當委託。一旦你這樣做了,你可以添加它作爲一個事件處理程序,這將正確地通過。

或者是否有必要編寫一個物理方法來引發一個事件,以便您可以反射地將它連接到另一個事件?

是的,這是必需的。你不能僅僅「勾住」兩個事件 - 你需要有一些東西(一種方法)引發第二個事件。

+0

我明白這一點。但是讓我們說我有一個名爲MyEvent的事件。我可以直接編寫「MyEvent.Invoke()」,但看起來沒有辦法反思地獲取「Invoke()」方法。你可否確認?如果不是,那麼看起來我會學習如何儘快發佈代碼。謝謝。 –

+0

@BrandonMoore你在尋找'EventInfo.RaiseMethod'嗎? http://msdn.microsoft.com/en-us/library/system.reflection.eventinfo.raisemethod.aspx –

+0

I.e我想這樣做反思:event1 + =()=> event2(); –

0

你可以引發事件調用與該事件相關的「開」的方法。通常會執行並按預期工作。

下面的例子

創建一個空的文本框

 TextBox myTextBox = new TextBox(); 
     myTextBox.TextChanged += new EventHandler(myTextBox_TextChanged); 

     void myTextBox_TextChanged(object sender, EventArgs e) 
     { 
      Console.WriteLine("something"); 
     } 

的 「反思」 提高TextChange事件

 MethodInfo mi = myTextBox.GetType().GetMethod("OnTextChanged", BindingFlags.Instance | BindingFlags.NonPublic); 
     try 
     { 
      mi.Invoke(myTextBox, new object[] { EventArgs.Empty }); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex);     
     }