2012-04-18 2 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

감사합니다. Joshua. 이 작품! 하지만, 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 코드가 잘못되었다고 생각합니다.

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가 플래그 열거하지, 그래서 '이 아니라'작업은 하나의 언어에서 의미있는 결과를 생성하지 않습니다 : 코드는 다음 C# 코드처럼 실행합니다. 메시지 상자의 텍스트를 보면 VB에서 VarType(ItemValues(i)) <> VariantType.Array, Information.VarType(ItemValues[i]) != VariantType.Array이라는 올바른 조건이됩니다.

VB 6 호환성 기능을 피하면 if (!(ItemValues[i] is Array))을 쓸 수 있습니다.

C#에서 VB 6 호환성 기능을 계속 사용하여 이식을 쉽게하려면 Microsoft.VisualBasic.dll에 대한 참조를 추가해야합니다.