1

我正在将一个 VB.NET 项目转换为 C#,但我陷入了这个 if 循环,有人可以帮我转换它吗?我假设我需要为此使用 GetType() 方法,但我不确定如何。

循环:

Private Sub oOpcGroup_DataChange(ByVal TransactionID As Integer, ByVal NumItems As Integer, ByRef ClientHandles() As Integer, ByRef ItemValues() As Object, ByRef Qualities() As Integer, ByRef TimeStamps() As Date)

    Dim i As Integer

    For i = 1 To NumItems
        If VarType(ItemValues(i)) And Not VariantType.Array Then
            txtSubValue.Text = ItemValues(i)
        Else
            MsgBox("Data type return error, returned array, expected single item", MsgBoxStyle.Critical, "Data Change Error")
            Exit Sub
        End If
    Next i
    Exit Sub
End Sub

这是我到目前为止所拥有的:

void oOpcGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)    //Events OPCGroup
    {

        for (int i = 0; i < NumItems; i++)
        {
            if(){

            }
            else
            {
                MessageBox.Show("Expected single item.", "Data type return error.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

    }
4

2 回答 2

3

这是我想出的,使用 GetType() 而不是 Information.VarType。

我确实将 MsgBox 方法调用替换为对 System.Windows.Forms.MessageBox.Show 的调用。

private void oOpcGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)  
{

    for (int i = 0; i < NumItems; i++)
    {
        var obj = ItemValues.GetValue(i);

        if (obj != null && !obj.GetType().IsArray)
        {
            txtSubValue.Text = obj.ToString();
        }
        else
        {
            System.Windows.Forms.MessageBox.Show("Data type return error, returned array, expected single item", "Data Change Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
于 2012-04-18T11:59:50.173 回答
2

忘记自动代码转换器吧,它们经常在转换中出错,特别是如果它们没有可用的完整上下文(ItemValues 的声明等)

我认为在这种情况下原始的 VB 代码是不正确的。该代码将像以下 C# 代码一样执行:

int i = 0;

for (i = 1; i <= NumItems; i++) {
    if ((Information.VarType(ItemValues[i]) & ~VariantType.Array) != 0) {
        txtSubValue.Text = ItemValues[i];
    } else {
        Interaction.MsgBox("Data type return error, returned array, expected single item", MsgBoxStyle.Critical, "Data Change Error");
        return;
    }
}

但是,VariantType 不是标志枚举,因此“与非”操作在任何一种语言中都不会产生有意义的结果。根据消息框中的文本,正确的条件是VarType(ItemValues(i)) <> VariantType.Array在 VB 中,Information.VarType(ItemValues[i]) != VariantType.Array.

避免使用 VB 6 兼容函数,您可以编写if (!(ItemValues[i] is Array)).

如果您想继续使用 C# 中的 VB 6 兼容函数来简化移植,您需要添加对 Microsoft.VisualBasic.dll 的引用。

于 2012-04-18T11:57:18.057 回答