【问题标题】:Pass a variable in as a member name to an Object?将变量作为成员名称传递给对象?
【发布时间】:2015-01-06 11:19:46
【问题描述】:

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

基本上我使用的 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

有没有有效的方法objName.(value of CollName)(2).GetType().GetProperties()

【问题讨论】:

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

标签: vb.net variables object member


【解决方案1】:

这似乎已经使用 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

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2017-07-21
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多