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)
整个代表的事情让我失望.任何人都可以帮我转换吗?或者是否有一篇文章解释了如何做到这一点?
这是一个匿名函数,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)
请注意,此转换未经测试且可能错误:确切的转换可能非常复杂.
我最喜欢这样做的方法是在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)
| 归档时间: |
|
| 查看次数: |
3288 次 |
| 最近记录: |