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

Information.VarTypeの代わりにGetType()を使用して、私が思いついたものを次に示します。

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はフラグ列挙型ではないため、「AndNot」操作はどちらの言語でも意味のある結果を生成しません。メッセージボックスのテキストを見ると、正しい条件はVarType(ItemValues(i)) <> VariantType.ArrayVBにあり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 に答える