VarType to GetType()
本文关键字:GetType to VarType | 更新日期: 2023-09-27 18:31:41
我正在将一个 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);
}
}
}
这是我使用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);
}
}
}
忘记自动代码转换器,它们在转换中经常出错,特别是如果它们没有完整的上下文可用(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.Array
,Information.VarType(ItemValues[i]) != VariantType.Array
.
避免使用 VB 6 兼容函数,您可以编写if (!(ItemValues[i] is Array))
.
如果要继续使用 C# 中的 VB 6 兼容函数来简化移植,则需要添加对 Microsoft.VisualBasic.dll 的引用。