如何将委托从c#转换为vb.net?

Pau*_*mke 2 c# vb.net delegates

我有这个代码我试图从C#转换为VB.net:

public object Invoke(object instance, object[] inputs, out object[] outputs)
        {
            // Create a new, STA thread
            object[] staOutputs = null;
            object retval = null;
            Thread thread = new Thread(
                delegate(){
                    retval = _innerInvoker.Invoke(instance, inputs, out staOutputs);
                });
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
            outputs = staOutputs;
            return retval;
        }
Run Code Online (Sandbox Code Playgroud)

整个代表的事情让我失望.任何人都可以帮我转换吗?或者是否有一篇文章解释了如何做到这一点?

Joe*_*orn 8

这是一个匿名函数,VB.Net不支持这样的匿名函数(假设.Net 2.0,因为在.Net 3.5中将编写为lambda表达式).

你可以在VB.Net中做的最好的事情是在同一个类中添加匿名函数(委托)作为一个单独的方法,并使用AddressOf运算符来引用这个新方法.


更新:
再次读取代码,翻译很复杂,因为您的匿名方法将被解释为闭包,这意味着C#编译器在将代码转换为IL之前对代码进行了复杂的转换; 创建一个全新的类是捕获(关闭)方法中引用的局部变量:

Class InnerInvokerClosure
    Public instance As Object
    Public inputs() As Object
    Public staOutputs() As Object
    Public retValue As Object

    Public _innerInvoker As SomeDelegateType

    Sub New(ByRef instance as Object, ByRef inputs() as Object, ByRef staOutputs() As Object, ByRef retValue As Object, ByRef _innerInvoker As SomeDelegateType)
        Me.instance = instance
        Me.inputs = inputs
        Me.staOoutputs = staOutputs
        Me.retValue = retValue

        Me._innerInvoker = _innerInvoker
    End Sub

    Public Function Invoke() As Object
        retValue = _innerInvoker.Invoke(instance, inputs, staOutputs);
    End Function

End Class

Public Function Invoke(ByVal instance As Object, ByVal inputs() as Object, ByRef outputs() As Object) As Object
    Dim closure As New InnerInvokerClosure(instance, inputs, Nothing, Nothing, _innerInvoker)

    Dim t As New Thread(AddressOf closure.Invoke)
    t.SetApartmentState(ApartmentState.STA)
    t.Start()
    t.Join()

    outputs = closure.staOutputs
    return closure.retValue      
End Function
Run Code Online (Sandbox Code Playgroud)

请注意,此转换未经测试且可能错误:确切的转换可能非常复杂.


Gre*_*egC 6

我最喜欢这样做的方法是在C#中编译,然后使用反射器来查看其他dotNET语言的外观.

Friend Class Program
' Methods '
Private Shared Function Foo(ByVal instance As Object, ByVal inputs As Object(), <Out> ByRef outputs As Object()) As Object
    outputs = Nothing
    Return Nothing
End Function

Public Function Invoke(ByVal instance As Object, ByVal inputs As Object(), <Out> ByRef outputs As Object()) As Object
    Dim staOutputs As Object() = Nothing
    Dim retval As Object = Nothing
    Dim thread As New Thread(Function 
        retval = Me._innerInvoker.Invoke(instance, inputs, staOutputs)
    End Function)
    thread.SetApartmentState(ApartmentState.STA)
    thread.Start
    thread.Join
    outputs = staOutputs
    Return retval
End Function

' Fields '
Private _innerInvoker As MyInvoker = New MyInvoker(AddressOf Program.Foo)
End Class


<CompilerGenerated> _
Private NotInheritable Class <>c__DisplayClass1
' Methods '
Public Sub <Invoke>b__0()
    Me.retval = Me.<>4__this._innerInvoker.Invoke(Me.instance, Me.inputs, Me.staOutputs)
End Sub


' Fields '
Public <>4__this As Program
Public inputs As Object()
Public instance As Object
Public retval As Object
Public staOutputs As Object()
End Class
Run Code Online (Sandbox Code Playgroud)