【问题标题】:Reflection - SetValue of array within class?反射 - 类内数组的 SetValue?
【发布时间】:2009-02-19 11:11:28
【问题描述】:

好的,我已经做了一段时间了,使用反射来完成很多我需要做的事情,但是我遇到了一个绊脚石......

我正在尝试使用反射来填充子属性数组的属性...不确定这是否清楚,因此最好在代码中进行解释:

父类:

Public Class parent
    Private _child As childObject()
    Public Property child As childObject()
        Get
            Return _child
        End Get
        Set(ByVal value As child())
            _child = value
        End Set
    End Property
End Class

儿童班:

Public Class childObject
    Private _name As String
    Public Property name As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

    Private _descr As String
    Public Property descr As String
        Get
            Return _descr
        End Get
        Set(ByVal value As String)
            _descr = value
        End Set
    End Property
End Class

所以,使用反射,我试图通过父对象设置子对象数组的值...

我已经尝试了几种方法...以下是我目前所拥有的(我添加了示例数据只是为了简单起见):

    Dim Results(1) As String

    Results(0) = "1,2"
    Results(1) = "2,3"
    Dim parent As New parent

    Dim child As childObject() = New childObject() {}
    Dim PropInfo As PropertyInfo() = child.GetType().GetProperties()
    Dim i As Integer = 0
    For Each res As String In Results 
        Dim ResultSet As String() = res.Split(",")
        ReDim child(i)

        Dim j As Integer = 0
        For Each PropItem As PropertyInfo In PropInfo
            PropItem.SetValue(child, ResultSet(j), Nothing)
            j += 1
        Next
        i += 1
    Next
    parent.child = child

这在 PropItem.SetValue 上以 ArgumentException 严重失败:找不到属性集方法。

有人有什么想法吗?

@乔恩:-

谢谢,我想我已经走得更远了,通过创建单独的子对象,然后将它们分配给一个数组......现在的问题是尝试将该数组分配给父对象(使用反射)。

这应该不难,但我认为问题来了,因为我不一定知道父/子类型。我正在使用反射来确定传入哪个父/子。父始终只有一个属性,即子对象的数组。当我尝试将子数组分配给父对象时,我得到一个无效的强制转换异常,说它无法将 Object[] 转换为 .

编辑: 基本上,我现在拥有的是:

Dim PropChildInfo As PropertyInfo() = ResponseObject.GetType().GetProperties()
For Each PropItem As PropertyInfo In PropChildInfo
    PropItem.SetValue(ResponseObject, ResponseChildren, Nothing)
Next

ResponseObject 是父类的实例,ResponseChildren 是childObject 类的数组。

这失败了: “System.Object[]”类型的对象无法转换为“childObject[]”类型。

【问题讨论】:

    标签: vb.net arrays reflection


    【解决方案1】:

    首先我要去掉等式中的数组部分——我看不出这有什么关系。尝试编写代码来设置 single 孩子的值。

    其次,您似乎依赖于 GetProperties 的结果是否符合所需顺序 - 您不应该这样做。无法保证返回属性的顺序。您应该根据要拆分的字符串知道所需的顺序,并按名称获取属性。

    第三,我怀疑问题是你有一些只读属性以及可写属性。我建议您创建一个简短的控制台应用程序来检查这一点,在设置之前记录您尝试设置的属性。

    如果这没有帮助,请发布一个简短但完整的控制台应用程序来演示该问题,我相信我们将能够解决它。

    编辑:好的,如果您现在只停留在数组部分,我建议您展示一个简短但完整的 that 示例。我怀疑问题是您创建了一个错误类型的数组。您可以使用 Array.CreateInstance 创建正确类型的数组,然后设置属性时该数组应该是有效的。

    【讨论】:

    • 问题已更新以说明我现在在哪里...感谢您的起点。
    【解决方案2】:

    有一些库可让您更轻松(更快)地使用反射。例如,Fasterflect 允许您编写以下内容:

    parent.Property("child").GetElement(index).SetFieldValue("Name",name);
    

    这将检索对象“父”上名为“子”的属性。由于我们希望它是一个数组,我们将在位置“index”(单个子实例)处获取元素并将其 Name 属性设置为“name”。

    免责声明:我作为贡献者参与了上述项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多