2009-05-26 6 views
2

bezieht sich auf: Reflection - setting Type of returned obj? Ich habe ein Objekt Call Jobcard mit ein paar Eigenschaften, von denen eine andere Objekt namens Customer mit eigenen Eigenschaften, von denen eine andere verschachtelte Objekt namens Adresse ist.Reflection - Eigenschaften von geschachtelten Objekten erhalten

Diese beiden Funktionen behandeln auch andere Objekttypen.

private T PopulateObject<T>(T dataObj, System.Data.DataRow dataRow) 
{ 

    //Type type = dataObj.GetType(); 
    System.Reflection.PropertyInfo[] proplist = dataObj.GetType().GetProperties(); 

    foreach (System.Reflection.PropertyInfo propertyitem in proplist) 
    { 
     if(propertyitem.Name != "") 
     //s += propertyitem.Name + ":" + (propertyitem.GetValue(dataObj,null)).ToString() + "\r\n"; 
      try 
      { 
       propertyitem.SetValue(dataObj, dataRow[propertyitem.Name], null); 
      } 
      catch (Exception ex) 
      { 
       if (ex.Message.Contains("does not belong to table")) 
       { 
        propertyitem.SetValue(dataObj, PopulateChildObject(propertyitem, dataRow), null); 
       } 
       else 
       throw; 
      } 
    } 
    return dataObj; 
} 



private object PopulateChildObject(object dataObj, System.Data.DataRow dataRow) 
{ 

    System.Reflection.PropertyInfo[] proplist = dataObj.GetType().GetProperties(); 

    foreach (System.Reflection.PropertyInfo propertyitem in proplist) 
    { 
     if(propertyitem.Name != "") 
      try 
      { 
       propertyitem.SetValue(dataObj, dataRow[propertyitem.Name], null); 
      } 
      catch (Exception ex) 
      {   
      if (ex.Message.Contains("does not belong to table")) 
       { 
        propertyitem.SetValue(dataObj, PopulateChildObject(propertyitem, dataRow), null); 
       } 
       else 
       throw; 
      } 
    } 
    return dataObj; 
} 

Das Problem ist, dass die PopulateChildObject Funktion funktioniert nicht, weil die Propertyinfo-Liste nicht, dass der übergebenen childObj ist. Wenn ich das dataObj ansehe, das an PopulateChildObject in der Uhr übergeben wurde, hat es 0 Attribute. Auch das an PopChildObj() übergebene dataObj hat den Typ System.Reflection.RuntimePropertyInfo 'anstelle von Customer. Was vermisse ich?

+0

(antwortete Kommentar) –

Antwort

3

propertyitem ist die PropertyInfo; Sie müssen den Wert von der Unterkunft passieren - das heißt

propertyItem.GetValue(dataObj, null); 

Wenn dieses Kind Objekt von der Mutter erstellt wird, sollten Sie nicht brauchen, um „Set“ es; nur aktualisieren, um die underyling Objekt:

PopulateChildObject(propertyitem.GetValue(dataObj, null), dataRow); 

Es kann Sie das untergeordnete Objekt (in der Regel Activator.CreateInstance) erstellen müssen sein, in welchem ​​Fall Sie wird Notwendigkeit SetValue nennen:

object child = propertyitem.GetValue(dataObj, null); 
if(child == null) { 
    child = Activator.CreateInstance(propertyitem.PropertyType); 
    propertyitem.SetValue(dataObj, child, null); 
} 
PopulateChildObject(child, dataRow); 

I Wunder, obwohl - gibt es wirklich einen Unterschied zwischen PopulateObject und PopulateChildObject? Es fühlt sich an, als könnten sie dasselbe sein?

+0

Unterschied zwischen PopulateObject und PopulateChildObject: ich nicht einen rekursiven Aufruf zu PopulateObject zu arbeiten, weil die Art des Childobject bekommen konnte muss auch übergeben werden. – callisto

+0

Nur weil Sie es generisch gemacht haben - aber (gemäß meiner Antwort auf die vorherige Frage) gibt es hier wenig Nutzen in den Generika. –

+0

Danke Mark. Ich habe es mit Hilfe von einem anderen Beitrag von dir wotking: http://www.eggheadcafe.com/conversation.aspx?messageid=30043135&threadid=30043131 propertyitem.PropertyType; ist was ich tun musste – callisto

0

Get Nest Eigenschaften zB Developer.Project.Name

private static System.Reflection.PropertyInfo GetProperty(object t, string PropertName) 
      { 
       if (t.GetType().GetProperties().FirstOrDefault(p => p.Name == PropertName.Split('.')[0]) == null) 
        throw new ArgumentNullException(string.Format("Property {0}, is not exists in object {1}", PropertName, t.ToString())); 
       if (PropertName.Split('.').Length == 1) 
        return t.GetType().GetProperty(PropertName); 
       else 
        return GetProperty(t.GetType().GetProperty(PropertName.Split('.')[0]).GetValue(t, null), PropertName.Split('.')[1]); 
      } 
Verwandte Themen