【问题标题】:Anonymous methods - C# to VB.NET匿名方法 - C# 到 VB.NET
【发布时间】:2009-08-02 23:29:52
【问题描述】:

我需要在终端服务器上实现应用程序的单个 VB.NET 实例。为此,我使用来自Flawless Code 博客的代码。它运行良好,除了代码是用 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!
    }
}

【问题讨论】:

    标签: c# vb.net event-handling anonymous-methods


    【解决方案1】:

    您可以使用此代码:

    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
    

    【讨论】:

    • 嗨 Ondatra,感谢您的回复,这看起来可以工作但是,当我尝试实现它时,我得到一个 ''AddressOf' 表达式无法转换为 'System.Delegate' 因为类型'System.Delegate' 被声明为 'MustInherit' 并且不能被创建。错误。再次感谢您的帮助。
    • 感谢昂达特拉。这似乎行得通。除了现在,我一直认为表单什么都不是。我会解决这个问题,让你知道我会做什么来解决它。再次感谢所有帮助过的人。我真的很感激。
    • 嗨 Ondatra,我发现了表单问题,但现在我得到了一个“System.Reflection.TargetParameterCountException is unhandled Message="Parameter count mismatch." Source="System.Windows.Forms"' 错误。有任何想法吗?讨厌一直问,但只是觉得我现在已经很接近答案了,这里有所有的帮助。再次感谢。
    • 我明白了(我想)。这要归功于 Ondatra 和 kek444 的答案的结合。我不得不将行 form.Invoke(New Action(Of String())(AddressOf updateFormMethod), e.Args) 更改为 form.Invoke(New Action(Of String())(AddressOf updateFormMethod), New Object() {e.Args}) 再次感谢所有的帮助......
    【解决方案2】:

    在 VS 2010 的 VB.NET 中,您可以执行以下操作:

    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
    

    【讨论】:

    • 嗨 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
    

    【讨论】:

    • 谢谢kek444,我想我明白了,谢谢你的回答和ondatra的回答......
    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多