如何将此C#事件/委托代码转换为VB.NET(2008或2010)

时间:2013-08-15 07:27:53

标签: c# vb.net c#-to-vb.net code-conversion code-translation

C#到VB.NET这是相关的C#代码

namespace MyApp {
   public delegate bool AllocHandlerDelegate(int param1);

   public interface ILoader  {
    event AllocHandlerDelegate evAlloc;
    bool Load();
    }

   public class MyLoader : ILoader  {
    public event AllocHandlerDelegate evAlloc;

        public bool Load() {
            try  {
           if (this.evAlloc != null && !evAlloc(1))
                          return false;
        }
   }
}

这是我到目前为止所提出的。 C#委托是一个返回布尔结果的函数。所以我将委托定义和事件声明转换成如下。

    Public Delegate Function AllocHandlerDelegate(ByVal param1 As Integer) As Boolean
    Public Event evAlloc As AllocHandlerDelegate

使用错误消息返回Visual Studio:“无法使用具有返回类型的委托类型声明事件。”

所以我把它变成了SUB,并完成了这样的翻译*。

Namespace MyApp
    Public Delegate Sub AllocHandlerDelegate(ByVal param1 As Integer)

    Public Interface ILoader
        Event evAlloc As AllocHandlerDelegate

    Function Load() As Boolean
    End Interface

    Public Class MyLoader
        Implements ILoader

        Public Event evAlloc As AllocHandlerDelegate Implements ILoader.evAlloc

        Public Function Load() as Boolean Implements ILoad.Load
            Try
                    If Me.evAllocEvent IsNot Nothing AndAlso Not evAlloc(1) Then
                        Return False
            End Try
        End Function
    End Class
End Namespace

*注意:我已经意识到我无法检查“事件”对象是什么,但是对于VB内部委托对象* EVENTNAME *事件。

然而,对于第二部分,我不知道如何处理它。在那里,我收到以下错误消息: '公共事件evAlloc(param1 As Integer)'是一个事件,不能直接调用。使用'RaiseEvent'语句来举起活动。

任何想法?!谢谢

2 个答案:

答案 0 :(得分:1)

错误信息非常清楚:

  

公共事件evAlloc(param1 As Integer)'是一个事件,不能直接调用。使用'RaiseEvent'语句来引发事件。

这是一个事件,你不能直接调用它。改为使用'RaiseEvent'语句:

RaiseEvent evAlloc(1)

您的事件无法返回值(C#等效值),但您可以使用普通代理。

Public Delegate Function AllocHandlerDelegate(ByVal param1 As Integer) As Boolean

Public Interface ILoader
    Property evAlloc As AllocHandlerDelegate
    Function Load() As Boolean
End Interface

Public Class MyLoader
    Implements ILoader

    Public Property evAlloc As AllocHandlerDelegate Implements ILoader.evAlloc

    Public Function Load() as Boolean Implements ILoader.Load
            If Me.evAlloc IsNot Nothing AndAlso Not evAlloc(1) Then _
                Return False
            ' Do Stuff '
            Return True
    End Function
End Class

使用返回值的事件很糟糕,因为事件可能有多个订阅者,您可能不知道将返回哪个值。

答案 1 :(得分:-1)

这是一个VB版本,这些内联函数需要框架4.0或更高版本......

    ILoader.evAlloc = Function(rows As Object)
                                 Dim p As Person = TryCast(rows, Person)
                                 If (p.Age And 1) Then
                                     Return 0
                                 Else
                                     Return 1
                                 End If
                             End Function

抱歉没看过'2010',你需要使用;

 yourfunction.yourevent = New eventype(AddressOf yourfunction)

或使用;

 addhandler

http://msdn.microsoft.com/en-us/library/6yyk8z93(v=vs.90).aspx