2012-04-18 11 views
1

私はVB.NETプロジェクトをC#に変換していますが、私はこのif-loopに取り残されています。私はこれにGetType()メソッドを使用する必要があると仮定していますが、どのようにすればよいか分かりません。VarType to GetType()

ループ:

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); 
      } 
     } 

    } 

答えて

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); 
     } 
    } 
} 
+0

ありがとうございます。これは動作します!私はtxtSubValue.Text = objの後に.ToString()を追加しなければならなかった。 – Charp

2

は、彼らがいっぱい持っていない場合は特に、彼らは頻繁に変換中にミスをし、自動コードコンバータを忘れ:

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 

これは私がこれまでにしたものです文脈が利用可能(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はフラグ列挙型ではないので、「AND NOT」操作は、いずれかの言語で意味のある結果を生成されていません。 メッセージボックスのテキストを参照すると、正しい条件はVBのVarType(ItemValues(i)) <> VariantType.ArrayInformation.VarType(ItemValues[i]) != VariantType.Arrayになります。

VB6互換機能を回避するには、if (!(ItemValues[i] is Array))と書くことができます。

移植性を向上させるためにC#のVB 6互換機能を引き続き使用する場合は、Microsoft.VisualBasic.dllへの参照を追加する必要があります。

関連する問題