Анонимные методы - C # для VB.NET

2

У меня есть требование реализовать один экземпляр VB.NET приложения на сервере терминалов. Для этого я использую код из Безупречный код. Он хорошо работает, за исключением того, что код написан на С# и использует анонимный метод, который не поддерживается в 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!
    }
}
Теги:
event-handling
anonymous-methods

3 ответа

6
Лучший ответ

Вы можете использовать этот код:

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
  • 0
    Привет Ондатра, спасибо за ответ, похоже, что он может работать, однако, когда я пытаюсь реализовать его, я получаю, что выражение 'AddressOf' не может быть преобразовано в 'System.Delegate', потому что объявлен тип 'System.Delegate' MustInherit 'и не может быть создан.' ошибка. Еще раз спасибо за вашу помощь.
  • 0
    Извините, я не заметил ошибку. Я исправил код.
Показать ещё 3 комментария
4

В 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
  • 0
    Привет pb, спасибо, я использую VS2008, однако, мне не нравится объявлять Sub в Sub. Я получаю 'End Sub' должен предшествовать соответствующий 'Sub' ..
3

Это:

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
  • 0
    Спасибо kek444, я думаю, что я понял, спасибо вам за комбинацию вашего ответа и ответа ondatra ....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню