2013-04-03 75 views
1

我在將示例從C#轉換爲VB.NET時遇到了問題。VB.NET:在運行時將類事件添加到接口事件

C#示例具有以下結構。 首先有一個公共代表。

public delegate void CustomEventHandler(object sender , EventArgs e); 

該代表連接到接口事件。

public interface ICustom { 
    event CustomEventHandler MyEvent; 
} 

最後我得到了一個與委託相關的事件的類。另外還有一個以接口爲參數的函數。

public class Test { 
    public event CustomEventHandler OnEvent; 

    public void MySub(ICustom custom) { 
     custom.MyEvent += OnEvent; 
    } 
} 

我可以轉換此代碼,除了添加類事件的參數事件。我的VB.NET代碼如下所示:

Public Delegate Sub CustomEventHandler(ByVal sender As Object, ByVal e As EventArgs) 

Public Interface ICustom 

    Event MyEvent As CustomEventHandler 
End Interface 

Public Class Test 

    Public Event OnEvent As CustomEventHandler 

    Public Sub MySub(ByVal custom As ICustom) 
     ... How can I add here the event OnEvent to the event custom.MyEvent? ... 
    End Sub 
End Class 

是否有可能將其轉換或有其他必要的方式。 感謝您的任何迴應。

回答

0

事件關鍵字的VB.NET版本有更嚴格的規則,你不能到達底層的委託對象。你需要編寫自定義事件,因此您可以:

Private BackingField As CustomEventHandler 

Public Custom Event OnEvent As CustomEventHandler 
    AddHandler(ByVal value As CustomEventHandler) 
     BackingField = DirectCast(CustomEventHandler.Combine(BackingField, value), CustomEventHandler) 
    End AddHandler 

    RemoveHandler(ByVal value As CustomEventHandler) 
     BackingField = DirectCast(CustomEventHandler.Remove(BackingField, value), CustomEventHandler) 
    End RemoveHandler 

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) 
     BackingField.Invoke(sender, e) 
    End RaiseEvent 
End Event 

現在,您可以實現MySub:

Public Sub MySub(ByVal custom As ICustom) 
    AddHandler custom.MyEvent, BackingField 
End Sub 

當心,這是一個自定義事件的非線程版本,你會如果事件可以在另一個線程中取消/訂閱,則需要使用SyncLock使其線程安全。

+0

解決了我的問題。感謝您的快速回答。 – mburm 2013-04-03 19:58:43