我正在尝试使用反射来填充子属性数组的属性...不确定是否清楚,所以最好在代码中解释:
父类:
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 []”类型。
答案 0 :(得分:4)
首先,我要摆脱等式中的数组部分 - 我无法看出它是如何相关的。尝试编写代码来设置单个子项的值。
其次,您似乎依赖于GetProperties
按期望顺序的结果 - 您不应该这样做。无法确保返回属性的顺序。您应根据要拆分的字符串知道所需的顺序,并按名称获取属性。
第三,我怀疑问题是你有一些只读属性和可写属性。我建议您启动一个简短的控制台应用程序来检查这一点,在设置之前记录您尝试设置的属性。
如果这没有帮助,请发布一个简短但完整的控制台应用程序来演示问题,我相信我们能够解决它。
编辑:好的,如果你现在只是在数组部分,我建议你显示一个简短但完整的的例子。我怀疑问题是你创建了一个错误类型的数组。您可以使用Array.CreateInstance创建正确类型的数组,当您设置属性时该数组应该有效。
答案 1 :(得分:1)
有些库可以让它更容易(也更快)地使用反射。例如,Fasterflect允许您编写以下内容:
parent.Property("child").GetElement(index).SetFieldValue("Name",name);
这将在对象“parent”上检索名为“child”的属性。由于我们希望它是一个数组,我们将在“index”(单个子实例)位置获取元素,并将其Name属性设置为“name”。
免责声明:我作为贡献者参与了该项目。