Vb.net 将变量作为成员名传入对象?
不确定这是否可行,但我需要能够将变量的值作为对象的成员名传入 基本上,我使用的wdsl有很多对象,其中一些对象可能包含一个集合,我需要制作数据网格来显示集合中的数据,这非常简单,但目前我必须为每个对象/集合编写代码,定义有效列的数量及其名称和类型 尽管有点冗长,但它仍然可以正常工作,但如果wdsl更改,并且对象集合内容更改(名称、类型等),它也会中断 我需要的是能够将一个对象名传递给一个子对象,该子对象将确定该对象是否包含集合(PropertyType将包含[]),读取其名称并将该名称传递给一个循环,该循环将以正确的级别进行,以检索“列”名称和数据类型 在我想将集合名作为对象成员名传递到一个循环中之前,我已经完成了几乎所有的工作,因为在下面的示例中,它显然不会计算CollName的字符串值,只会错误地说CollName不是对象的成员,当然不是,但变量的实际值是Vb.net 将变量作为成员名传入对象?,vb.net,variables,object,member,Vb.net,Variables,Object,Member,不确定这是否可行,但我需要能够将变量的值作为对象的成员名传入 基本上,我使用的wdsl有很多对象,其中一些对象可能包含一个集合,我需要制作数据网格来显示集合中的数据,这非常简单,但目前我必须为每个对象/集合编写代码,定义有效列的数量及其名称和类型 尽管有点冗长,但它仍然可以正常工作,但如果wdsl更改,并且对象集合内容更改(名称、类型等),它也会中断 我需要的是能够将一个对象名传递给一个子对象,该子对象将确定该对象是否包含集合(PropertyType将包含[]),读取其名称并将该名称传递给一个
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”的情况下工作。我需要能够提取这个(第一个反射循环实现的),并将其传递到第二个循环