Анонимные методы — от C# до VB.NET
-
10-07-2019 - |
Вопрос
У меня есть требование реализовать один экземпляр приложения VB.NET на терминальном сервере.Для этого я использую код из Безупречный код блог.Он работает хорошо, за исключением того, что код написан на C# и использует анонимный метод, который не поддерживается в VB.NET.Мне нужно переписать следующее, чтобы я мог использовать его как событие в VB.NET.
static Form1 form;
static void singleInstance_ArgumentsReceived(object sender, ArgumentsReceivedEventArgs e)
{
if (form == null)
return;
Action<String[]> updateForm = arguments =>
{
form.WindowState = FormWindowState.Normal;
form.OpenFiles(arguments);
};
form.Invoke(updateForm, (Object)e.Args); //Execute our delegate on the forms thread!
}
}
Решение
Вы можете использовать этот код:
Private Shared form As Form1
Private Shared Sub singleInstance_ArgumentsReceived(ByVal sender As Object, ByVal e As ArgumentsReceivedEventArgs)
If form Is Nothing Then Return
form.Invoke(New Action(Of String())(AddressOf updateFormMethod), e.Args)
End Sub
Private Shared Sub updateFormMethod(ByVal arguments As String())
form.WindowState = FormWindowState.Normal
form.OpenFiles(arguments)
End Sub
Другие советы
В VB.NET в VS 2010 вы можете делать следующее:
Shared form As Form1
Shared Sub singleInstance_ArgumentsReceived(ByVal sender As Object, ByVal e As ArgumentsReceivedEventArgs)
If form Is Nothing Then Return
Dim updateForm As Action(Of String()) = Sub(arguments)
form.WindowState = FormWindowState.Normal
form.OpenFiles(arguments)
End Sub
form.Invoke(updateForm, e.args)
End Sub
Этот:
public void Somemethod()
{
Action<String[]> updateForm = arguments =>
{
form.WindowState = FormWindowState.Normal;
form.OpenFiles(arguments);
};
}
Будет то же самое, что:
public void Somemethod()
{
Action<String[]> updateForm = OnAction;
}
//named method
private void OnAction(string[] arguments)
{
form.WindowState = FormWindowState.Normal;
form.OpenFiles(arguments);
}
Затем вы легко выполняете переход VB.net примерно так:
Public Sub SomeMethod()
Dim updateForm As Action(Of String()) = New Action(Of String())(AddressOf Me.OnAction)
Me.form.Invoke(updateForm, New Object() { e })
End Sub
Private Sub OnAction(ByVal arguments As String())
form.WindowState = FormWindowState.Normal
form.OpenFiles(arguments)
End Sub
Не связан с StackOverflow