在vb.net中使用Delegates

时间:2016-07-08 08:03:05

标签: vb.net

我是vb.net的新手并试图在vb.net中构建一个win CE应用程序。手持设备的sdk是在C#中,我用在线转换器转换为vb.net。 下面是C#代码:

public class DecodeEventArgs : EventArgs
{
    private string barcode;
    private byte type;

    public DecodeEventArgs(string barcodeData, byte typeData)
    {
        barcode = barcodeData;
        type = typeData;
    }

    public string Barcode
    {
        get { return barcode; }
        set { barcode = value; }
    }

    public byte Type
    {
        get { return type; }
        set { type = value; }
    }

}

转换为vb.net:

Public Class DecodeEventArgs
    Inherits EventArgs
    Public barcode As String
    Public type As Byte

    Public Sub New(ByVal barcodeData As String, ByVal typeData As Byte)
        barcode = barcodeData
        type = typeData
    End Sub

    Public Property pBarcode() As String
        Get
            Return barcode
        End Get
        Set(ByVal value As String)
            barcode = value
        End Set
    End Property

    Public Property pType() As Byte
        Get
            Return type
        End Get
        Set(ByVal value As Byte)
            type = value
        End Set
    End Property
End Class

在我从C#转换时,我在我的vb.net代码中添加了一个'p'到属性的名称,因为我有一个错误说

  

条形码已在此类中声明为公共字符串

我不确定这是否是我问题的一部分,但我真正的问题是,在他们使用的表格上.BeginInvoke用这段代码调用该类:

void scanner_DecodeEvent(object sender, DecodeEventArgs e)
    {
        Win32.sndPlaySound(Properties.Resources.Scan, Win32.SND_ASYNC | Win32.SND_MEMORY);

        this.BeginInvoke((Action<string>)delegate(string barcode)
        {
            scanCount = 0;
            ListViewItem item = new ListViewItem(new string[] { barcode });
            lstView.Items.Insert(0, item);

        }, e.Barcode);
    } 

我将其转换为vb.net:

Private Sub scanner_DecodeEvent(ByVal sender As Object, ByVal e As DecodeEventArgs)
    PlaySound()

    Me.BeginInvoke(DirectCast(Barcode As String) ) 
    scanCount = 0
    Dim item As New ListViewItem(New String() {barcode})

    lstView.Items.Insert(0, item)


End Sub 

这给了我一个关于没有声明条形码的错误。这就是我被困住的地方。感谢您的帮助

1 个答案:

答案 0 :(得分:0)

C#片段创建一个匿名方法,它调用该方法来执行UI线程上的操作,并发送e.Barcode作为参数。您的VB.NET转换仅尝试调用DirectCast的一些奇怪且不完整的使用。 VB.NET转换中不需要DirectCast,因为您没有任何必须强制转换为委托方法的delegate关键字。

您最简单的解决方案是使用Lambda方法:

Me.BeginInvoke(Sub() 'Lambda anonymous method.
    scanCount = 0
    Dim item As New ListViewItem(New String() {e.Barcode})
    lstView.Items.Insert(0, item)
End Sub)

修改

由于在使用lambda表达式时出现错误,我假设您以.NET Framework 3.5或更低版本为目标。就此而言,它变得有点复杂,因为您现在必须将代码放在不同的方法中:

Private Sub AddBarcode(ByVal Barcode As String)
    scanCount = 0
    Dim item As New ListViewItem(New String() {Barcode})
    lstView.Items.Insert(0, item)
End Sub

然后,您必须声明自己的委托方法,以便执行调用:

Delegate Sub AddBarcodeDelegate(ByVal Barcode As String)

Private Sub scanner_DecodeEvent(ByVal sender As Object, ByVal e As DecodeEventArgs)
    Me.BeginInvoke(New AddBarcodeDelegate(AddressOf AddBarcode), e.Barcode)
End Sub