Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将变量作为成员名传入对象?_Vb.net_Variables_Object_Member - Fatal编程技术网

Vb.net 将变量作为成员名传入对象?

Vb.net 将变量作为成员名传入对象?,vb.net,variables,object,member,Vb.net,Variables,Object,Member,不确定这是否可行,但我需要能够将变量的值作为对象的成员名传入 基本上,我使用的wdsl有很多对象,其中一些对象可能包含一个集合,我需要制作数据网格来显示集合中的数据,这非常简单,但目前我必须为每个对象/集合编写代码,定义有效列的数量及其名称和类型 尽管有点冗长,但它仍然可以正常工作,但如果wdsl更改,并且对象集合内容更改(名称、类型等),它也会中断 我需要的是能够将一个对象名传递给一个子对象,该子对象将确定该对象是否包含集合(PropertyType将包含[]),读取其名称并将该名称传递给一个

不确定这是否可行,但我需要能够将变量的值作为对象的成员名传入

基本上,我使用的wdsl有很多对象,其中一些对象可能包含一个集合,我需要制作数据网格来显示集合中的数据,这非常简单,但目前我必须为每个对象/集合编写代码,定义有效列的数量及其名称和类型

尽管有点冗长,但它仍然可以正常工作,但如果wdsl更改,并且对象集合内容更改(名称、类型等),它也会中断

我需要的是能够将一个对象名传递给一个子对象,该子对象将确定该对象是否包含集合(PropertyType将包含[]),读取其名称并将该名称传递给一个循环,该循环将以正确的级别进行,以检索“列”名称和数据类型

在我想将集合名作为对象成员名传递到一个循环中之前,我已经完成了几乎所有的工作,因为在下面的示例中,它显然不会计算CollName的字符串值,只会错误地说CollName不是对象的成员,当然不是,但变量的实际值是

    Sub IterateObject(objName)
    Dim CollName = ""
    For Each m As System.Reflection.PropertyInfo In objName.GetType().GetProperties()
        If m.CanRead Then
            If InStr(m.PropertyType.ToString, "[]") <> 0 Then
                CollName = m.Name
            End If
        End If
    Next
    For Each p As System.Reflection.PropertyInfo In objName.CollName(2).GetType().GetProperties()
        If p.CanRead Then
            If p.Name <> "ExtensionData" Then
                MsgBox(p.Name & " - " & (p.PropertyType.ToString))
            End If
        End If
    Next
End Sub
子迭代对象(对象名)
Dim CollName=“”
对于objName.GetType().GetProperties()中的每个m As System.Reflection.PropertyInfo
如果我能读的话
如果InStr(m.PropertyType.ToString,“[]”)为0,则
CollName=m.Name
如果结束
如果结束
下一个
对于objName.CollName(2.GetType().GetProperties()中的每个p作为System.Reflection.PropertyInfo
如果p.能读的话
如果p.名称为“ExtensionData”,则
MsgBox(p.Name&“-”&(p.PropertyType.ToString))
如果结束
如果结束
下一个
端接头

有没有一种方法可以有效地执行objName.(CollName的值)(2).GetType().GetProperties()

这似乎已经解决了使用CallByName的问题,允许我根据需要创建一个新对象

Sub IterateObject(objName)
    Dim CollName = ""

    For Each m As System.Reflection.PropertyInfo In objName.GetType().GetProperties()
        If m.CanRead Then
            If InStr(m.PropertyType.ToString, "[]") <> 0 Then
                CollName = m.Name
            End If
        End If
    Next
    Dim CollObj
    CollObj = CallByName(objName, CollName, CallType.Get)
    For Each p As System.Reflection.PropertyInfo In CollObj(0).GetType().GetProperties()
        If p.CanRead Then
            If p.Name <> "ExtensionData" Then
                MsgBox(p.Name & " - " & (p.PropertyType.ToString))
            End If
        End If
    Next
End Sub
子迭代对象(对象名)
Dim CollName=“”
对于objName.GetType().GetProperties()中的每个m As System.Reflection.PropertyInfo
如果我能读的话
如果InStr(m.PropertyType.ToString,“[]”)为0,则
CollName=m.Name
如果结束
如果结束
下一个
Dim CollObj
CollObj=CallByName(objName、CollName、CallType.Get)
对于CollObj(0.GetType().GetProperties()中的每个p作为System.Reflection.PropertyInfo
如果p.能读的话
如果p.名称为“ExtensionData”,则
MsgBox(p.Name&“-”&(p.PropertyType.ToString))
如果结束
如果结束
下一个
端接头

我不太了解并怀疑XY问题,但集合名称通常没有什么价值,集合中的类型往往更有趣。可以基于空集合配置类型,但需要从对象(而不是集合名称)开始,集合需要是泛型。grody VB集合的arraylist不会告诉您有关项目类型的任何信息,我可能没有很好地解释,因此我将尝试给出一个示例。我有一个来自wdsl的方法,它将返回一个类似于“SrvRef.retrieveActiviesSupplyChainResponse”类型的对象,在对象浏览器中,我可以深入到“ActiveSupplyChains”,它显示为{Length=11},非常类似于数组,它包含字段名和值,在本例中有11个结果,我需要在网格中显示。现在已经建立了数组/集合名(“ActiveSupplyChains”),我现在需要循环“ActiveSupplyChains”以获取其中的字段名和字段类型。如果上面的代码显式定义了成员名,则可以正常工作,这样objName.ActiveSupplyChains(2).GetType().GetProperties()可以工作,但仅在集合名为“ActiveSupplyChain”的情况下工作。我需要能够提取这个(第一个反射循环实现的),并将其传递到第二个循环