2009-05-26 10 views
2

fait référence à: Reflection - setting Type of returned obj? J'ai un objet Call Jobcard avec quelques propriétés, dont l'un est un autre objet appelé Customer avec ses propres propriétés, dont l'un est un autre objet imbriqué appelé Adress.Réflexion - obtention des propriétés des objets imbriqués

Ces 2 fonctions traitent également d'autres types d'objets.

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; 
} 

Le problème est que la fonction PopulateChildObject ne fonctionne pas parce que la liste est PropertyInfo pas celle du childObj passé. Si je regarde le dataObj passé à PopulateChildObject dans la montre, il a 0 Attributs. Aussi le dataObj passé à PopChildObj() a le type de System.Reflection.RuntimePropertyInfo 'au lieu du type Client. Qu'est-ce que je rate?

+0

(répondu à un commentaire) –

Répondre

3

propertyitem est le PropertyInfo; vous devez passer la valeur de la propriété - à savoir

propertyItem.GetValue(dataObj, null); 

Si cet objet enfant est créé par le parent, vous ne devriez pas besoin de « régler » il; simplement mettre à jour l'objet Sous-jacent:

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

Il est peut-être que vous devez créer l'objet enfant (généralement Activator.CreateInstance), auquel cas vous aurez besoin d'appeler SetValue:

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

I étonnant, cependant - est-il vraiment une différence entre PopulateObject et PopulateChildObject? On dirait qu'ils pourraient être la même chose?

+0

différence entre PopulateObject et PopulateChildObject: Je ne pouvais pas obtenir un appel récursif à travailler PopulateObject parce que le type de ChildObject doit être passé aussi bien. – callisto

+0

Seulement parce que vous l'avez fait générique - mais (selon ma réponse à la question précédente) il y a peu d'avantages dans les génériques ici. –

+0

Merci Mark. Je l'ai eu wotking avec l'aide d'un autre poste par vous: http://www.eggheadcafe.com/conversation.aspx?messageid=30043135&threadid=30043131 propertyitem.PropertyType; est ce que je devais faire – callisto

0

Nest Recevoir les annonces par exemple, 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]); 
      }