2010-11-02 18 views
5

Accedo al valore della proprietà da un oggetto classe in fase di esecuzione utilizzando la riflessione in C#.C# - Recupero del valore della proprietà dalla classe figlio

public bool GetValue(string fieldName, out object fieldValue) 
    { 
     // Get type of current record 
     Type curentRecordType = _currentObject.GetType(); 
     PropertyInfo property = curentRecordType.GetProperty(fieldName); 

     if (property != null) 
     { 
      fieldValue = property.GetValue(_currentObject, null).ToString(); 
      return true; 
     } 
     else 
     { 
      fieldValue = null; 
      return false; 
     } 
    } 

Passare Nome proprietà come parametro: nomeCampo a questo metodo. Ora, ho bisogno di accedere a un valore di proprietà dall'oggetto figlio di sopra della classe in fase di esecuzione.
Qualcuno può per favore guidare come posso accedere al valore della proprietà dell'oggetto figlio?

+0

Hai un problema o c'è un'altra domanda qui? – leppie

+0

ha modificato la mia domanda, serve un modo per accedere al valore della proprietà dell'oggetto figlio. – iniki

risposta

6

Poiché si desidera poter trovare oggetti su oggetti figlio con nidificazione arbitraria, è necessaria una funzione che è possibile chiamare in modo ricorsivo. Ciò è complicato dal fatto che potresti avere figli che fanno riferimento ai loro genitori, quindi devi tenere traccia di quali oggetti hai visto prima nella tua ricerca.

static bool GetValue(object currentObject, string propName, out object value) 
{ 
    // call helper function that keeps track of which objects we've seen before 
    return GetValue(currentObject, propName, out value, new HashSet<object>()); 
} 

static bool GetValue(object currentObject, string propName, out object value, 
        HashSet<object> searchedObjects) 
{ 
    PropertyInfo propInfo = currentObject.GetType().GetProperty(propName); 
    if (propInfo != null) 
    { 
     value = propInfo.GetValue(currentObject, null); 
     return true; 
    } 
    // search child properties 
    foreach (PropertyInfo propInfo2 in currentObject.GetType().GetProperties()) 
    { // ignore indexed properties 
     if (propInfo2.GetIndexParameters().Length == 0) 
     { 
      object newObject = propInfo2.GetValue(currentObject, null); 
      if (newObject != null && searchedObjects.Add(newObject) && 
       GetValue(newObject, propName, out value, searchedObjects)) 
       return true; 
     } 
    } 
    // property not found here 
    value = null; 
    return false; 
} 

Se si sa che cosa bambino oggetto la vostra proprietà è in voi può semplicemente passare il percorso ad esso, in questo modo:

public bool GetValue(string pathName, out object fieldValue) 
{ 
    object currentObject = _currentObject; 
    string[] fieldNames = pathName.Split("."); 

    foreach (string fieldName in fieldNames) 
    { 
     // Get type of current record 
     Type curentRecordType = currentObject.GetType(); 
     PropertyInfo property = curentRecordType.GetProperty(fieldName); 

     if (property != null) 
     { 
      currentObject = property.GetValue(currentObject, null).ToString(); 
     } 
     else 
     { 
      fieldValue = null; 
      return false; 
     } 
    } 
    fieldValue = currentObject; 
    return true; 
} 

Invece di chiamare piace GetValue("foo", out val) si chiamerebbe come GetValue("foo.bar", out val).

+0

dare il nome del percorso per ogni proprietà non è possibile nel mio caso in quanto vi sono centinaia di proprietà. Vuoi un modo breve ed efficace in cui il mio codice può andare giù fino all'oggetto figlio e recuperare il valore della proprietà dando solo l'oggetto principale e il nome della proprietà come input. – iniki

+0

Quindi stai dicendo che hai un albero di oggetti in cui ogni proprietà tra tutti gli oggetti ha un nome univoco e vuoi essere in grado di trovare una proprietà annidata arbitrariamente solo il suo nome? (se hai foo.bar.baz.qux, vuoi semplicemente passare "qux" e avere la funzione capire che è all'interno di "foo.bar.baz") – Gabe

+0

sì, è necessario inserire solo l'oggetto principale e il nome della proprietà – iniki

0

Ottenere l'oggetto figlio utilizzando la riflessione, quindi utilizzare la riflessione per ottenere il valore allo stesso modo.

+0

intendi usando GetNestedTypes()? – iniki

0
public void Main(){ 
    var containerObject = new ContainerObject(); 
    object propertyValue; 
    object nestedPropertyValue; 
    if(GetValue(containerObject, "FirstPropertyName", out propertyValue){ 
     bool success = GetValue(propertyValue, "NestedPropertyName", out nestedPropertyValue); 
    } 

} 

public bool GetValue(object currentObject, string propertyName, out object propertyValue) 
{ 
    // Get type of current record 
    var currentObjectType = currentObject.GetType(); 
    PropertyInfo propertyInfo = currentObjectType.GetProperty(propertyName); 

    propertyValue = propertyInfo != null 
        ? propertyInfo.GetValue(currentObject,null) 
        : null; 
    return propertyValue == null; 
} 
+0

Grazie a smartcaveman, ma non anticipo in anticipo quale particolare proprietà dell'oggetto principale sarà padre della proprietà nidificata. In tal caso, lo snippet di codice non risolverà il mio problema. – iniki

+0

È possibile ottenere tutte le proprietà utilizzando GetProperties anziché GetProperty (nome). Potrei aiutarti di più se tu specificassi ulteriormente l'obiettivo. – smartcaveman

Problemi correlati