反射 - 类中的数组的SetValue?

时间:2009-02-19 11:11:29

标签: vb.net arrays reflection

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

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

父类:

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

这在使用ArgumentException的PropItem.SetValue上失败:找不到属性集方法。

有人有什么想法吗?

@Jon: -

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

这应该不难,但我认为问题的出现是因为我不一定知道父/子类型。我正在使用反射来确定传入哪个父/子。父父只有一个属性,它是子对象的数组。当我尝试将子数组分配给父对象时,我得到一个无效的强制转换异常,说它无法将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 []”类型。

2 个答案:

答案 0 :(得分:4)

首先,我要摆脱等式中的数组部分 - 我无法看出它是如何相关的。尝试编写代码来设置单个子项的值。

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

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

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

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

答案 1 :(得分:1)

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

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

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

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