首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VarType to GetType()

VarType to GetType()
EN

Stack Overflow用户
提问于 2012-04-18 19:32:14
回答 2查看 2.3K关注 0票数 1

我正在将一个VB.NET项目转换成C#,我被这个if循环卡住了,有人能帮我转换一下吗?我假设我将需要使用GetType()-method来完成此任务,但我不确定如何使用。

循环:

代码语言:javascript
复制
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

这就是我到目前为止所知道的:

代码语言:javascript
复制
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);
            }
        }

    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-18 19:59:50

下面是我想出的方法,使用GetType()而不是Information.VarType。

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

代码语言:javascript
复制
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);
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-04-18 19:57:18

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

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

代码语言:javascript
复制
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#中的VB6兼容性函数以简化移植,则需要添加对Microsoft.VisualBasic.dll的引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10208452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档