VB.NET转换为C#的帮助

3

你好,我有一个非常小的vb.net项目,在其中使用了一个专有的com对象来处理事件。我已经更改了com对象的名称,但是以下代码在语法上是正确的:

Public Class Form1
Private WithEvents PM As comObj.PManager
Delegate Sub SetTextCallback([text] As String)



Private Function PreTransmit(ByVal s As String) As String Handles PM.PreTransmit
    Me.SetText(s)
    Return s
End Function

Private Function PreResponse(ByVal s As String) As String Handles PM.PreResponse
    Return s
End Function
Private Sub SetText(ByVal [text] As String)

    If Me.textBox1.InvokeRequired Then
        Dim d As New SetTextCallback(AddressOf SetText)
        Me.Invoke(d, New Object() {[text]})
    Else
        Me.textBox1.Text = [text]
    End If
End Sub


Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    PM = CreateObject("ObjName.PManager")
End Sub
End Class

当用户单击按钮时,以上代码将创建对象,并且每当该对象获取数据时,它会触发一个事件,将数据传递到pretransmit或prereceive中。

我似乎无法弄清楚如何在C#中实现这个功能。

VB

Private WithEvents PM As comObj.PManager

c#

private comObj.PManager PM;

那么 WithEvents 怎么办呢?

VB

Private Function PreResponse(ByVal s As String) As String Handles PM.PreResponse
        Return s
End Function

c#

private string PreResponse(string s)
{
    return s;
}

但是 Handles PM.PreResponse 怎么办?

VB

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        PM = CreateObject("ObjName.PManager")
End Sub

c#

private void Button1_Click(System.Object sender, System.EventArgs e)
{
    PM = Interaction.CreateObject("ObjName.PManager");
}

我不确定我哪里出错了!?

我能写一个vb.net类并在c#中使用它吗?


2
你尝试过像这样的转换器吗:http://www.developerfusion.com/tools/convert/vb-to-csharp/ - Matt
谢谢,这个翻译似乎已经解决了大部分问题,但是我仍然有一个问题,有一行代码阻止了我的编译。PM = Interaction.CreateObject("ObjName.PManager");这行代码保持不变,谷歌说它在Microsoft.VisualBasic命名空间中。然而,我得到了以下错误:错误1:当前上下文中不存在“Interaction”名称。 - Adrian
现在已经解决了,我错过了VB引用! - Adrian
4个回答

4
VB.NET中的WithEvents关键字在C#中没有类似物。我记得,VB.NET将所有的WithEvents变量转换为属性,然后在setter中显式地附加/分离事件处理程序,就像你在C#中看到的那样。
由于C#没有这个功能,你需要自己跟踪它。由于你是显式创建对象的,所以这应该不难做到。你只需要为每个你想要处理的事件做以下操作:
PM.EventName += new EventHandlerType(EventHandlerMethodName);

在大多数情况下,编译器可以推断出EventHandlerType,因此您不需要包含它。这意味着您的代码可以变成:

PM.PreResponse += this.PreResponse

谢谢你和所有发表类似评论的人,他们提供了帮助。在上面提到的VB->C#翻译中,它确实做到了你所说的。然而,在编译之前,我仍然有一个问题,就像上面的评论所述。 - Adrian

2
C#没有handles语法。
您可以在代码中(在FormLoaded中)连接事件:
 PM.PreResponse += this.PreResponse;

1

在C#中,WithEvents是一个必须考虑的特性。与VB.Net不同,它并不是一种特殊的考虑因素。要为PreResponse添加处理程序,您需要在加载或初始化事件中(根据您是使用asp.net还是winforms)添加事件处理程序。

PM.Response += PreResponse;

编辑:为了满足@Adam Robinson的语义需求(因为我们生活在一个语义化的世界中),做出以下说明。

WithEvents关键字使开发人员可以访问Handles关键字。实际上,这种结构在C#中不存在,因为事件处理只能通过显式定义委托来处理(在VB.Net中也可以使用委托而不需要WithEvents关键字)。


错误,WithEvents在C#中不存在 - Adam Robinson
“不存在” 和 “是一个给定的” 二者都可以归结为:“不必要。” - Joel Etherton
我不同意...其中一个意味着“你不需要担心它”,而另一个意味着“你做不到,所以你必须做其他事情。” - Adam Robinson

1

但是 Handles PM.PreResponse 怎么办?

PM.PreResponse += PreResponse;

私有 void Button1_Click ...

PM = CreateObject("ObjName.PManager")

是等同于

PM = new comObj.PManager();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接