【问题标题】:How to Convert This C# Event/Delegate Code Into VB.NET (2008 or 2010)如何将此 C# 事件/委托代码转换为 VB.NET(2008 或 2010)
【发布时间】:2013-08-15 07:27:52
【问题描述】:

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*Event。

但是对于第二部分,我不知道如何处理它。在那里我收到以下错误消息: 'Public Event evAlloc (param1 As Integer)'是一个事件,不能直接调用。使用“RaiseEvent”语句来引发事件。

有什么想法吗?!谢谢你

【问题讨论】:

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


    【解决方案1】:

    错误信息很清楚:

    Public Event 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
    

    使用返回值的事件是不好的,因为事件可以有多个订阅者,而您可能不知道会返回哪个值。

    【讨论】:

      【解决方案2】:

      这是VB版本,这些内联函数需要framework 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多