2013-04-03 83 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