title: Reflection - SetValue of array within class?
body: <p>OK, I've been working on something for a while now, using reflection to accomplish a lot of what I need to do, but I've hit a bit of a stumbling block...</p>
  
  <p>I'm trying to use reflection to populate the properties of an array of a child property... not sure that's clear, so it's probably best explained in code:</p>
  
  <p>Parent Class:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>Child Class:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>So, using reflection, I'm trying to set the values of the array of child objects through the parent object...</p>
  
  <p>I've tried several methods... the following is pretty much what I've got at the moment (I've added sample data just to keep things simple):</p>
  
  <pre><code>    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
  </code></pre>
  
  <p>This fails miserably on PropItem.SetValue with ArgumentException: Property set method not found.</p>
  
  <p>Anyone have any ideas?</p>
  
  <p>@Jon :-</p>
  
  <p>Thanks, I think I've gotten a little further, by creating individual child objects, and then assigning them to an array... The issue is now trying to get that array assigned to the parent object (using reflection).</p>
  
  <p>It shouldn't be difficult, but I think the problem comes because I don't necessarily know the parent/child types. I'm using reflection to determine which parent/child is being passed in. The parent always has only one property, which is an array of the child object. When I try assigning the child array to the parent object, I get a invalid cast exception saying it can't convert Object[] to .</p>
  
  <p>EDIT:
  <em>Basically, what I have now is:</em></p>
  
  <pre><code>Dim PropChildInfo As PropertyInfo() = ResponseObject.GetType().GetProperties()
  For Each PropItem As PropertyInfo In PropChildInfo
      PropItem.SetValue(ResponseObject, ResponseChildren, Nothing)
  Next
  </code></pre>
  
  <p>ResponseObject is an instance of the parent Class, and ResponseChildren is an array of the childObject Class. </p>
  
  <p>This fails with:
  Object of type 'System.Object[]' cannot be converted to type 'childObject[]'.</p>