2013-04-16 7 views
5

Ich habe eine verschachtelte Menge von Objekten, dh einige Eigenschaften sind benutzerdefinierte Objekte. Ich möchte einen Objekteigenschaftswert innerhalb der Hierarchiegruppe erhalten, indem ich eine Zeichenfolge für den Eigenschaftsnamen verwende, und eine Form von "find" -Methode, um die Hierarchie nach einer Eigenschaft mit übereinstimmendem Namen zu durchsuchen und ihren Wert zu erhalten.Wie findet man einen Objekteigenschaftswert aus einer verschachtelten, objektierten Gruppe unter Verwendung einer Zeichenfolge als Eigenschaftsnamen?

Ist das möglich und wenn ja wie?

Vielen Dank.

EDIT

Klassendefinition in Pseudo-Code sein kann:

Class Car 
    Public Window myWindow() 
    Public Door myDoor() 
Class Window 
    Public Shape() 
Class Door 
    Public Material() 

Car myCar = new Car() 
myCar.myWindow.Shape ="Round" 
myDoor.Material = "Metal" 

Alles, was ein wenig gekünstelt, aber ich konnte den Wert der „Shape“ Eigenschaft „finden“ durch die magische Zeichenfolge „Shape“ mit in irgendeiner Form der Suchfunktion, beginnend mit dem obersten Objekt. dh:

string myResult = myCar.FindPropertyValue("Shape") 

Hoffentlich MyResult = "Round".

Dies ist, was ich bin.

Danke.

+1

try spezifischere –

+1

Verwenden Reflexion zu erhalten und 'PropertyInfo' http://stackoverflow.com/questions/1355090/using-propertyinfo-getvalue –

+0

einfach eine EDIT mit Beispiel hinzugefügt. Ändert dies die Reflexionsantwort? Die Verschachtelung ist wichtig. – SamJolly

Antwort

9

Basierend auf Klassen, die Sie in Ihrer Frage gezeigt haben, benötigen Sie einen rekursiven Aufruf, um Ihre Objekteigenschaften zu iterieren. Wie wäre es etwas, das man wiederverwenden:

object GetValueFromClassProperty(string propname, object instance) 
{ 
    var type = instance.GetType(); 
    foreach (var property in type.GetProperties()) 
    { 
     var value = property.GetValue(instance, null); 
     if (property.PropertyType.FullName != "System.String" 
      && !property.PropertyType.IsPrimitive) 
     { 
      return GetValueFromClassProperty(propname, value); 
     } 
     else if (property.Name == propname) 
     { 
      return value; 
     } 
    } 

    // if you reach this point then the property does not exists 
    return null; 
} 

propname ist die Eigenschaft, die Sie suchen. Sie können, ist wie folgt verwenden:

var val = GetValueFromClassProperty("Shape", myCar); 
4

Ja, das ist möglich.

public static Object GetPropValue(this Object obj, String name) { 
    foreach (String part in name.Split('.')) { 
     if (obj == null) { return null; } 

     Type type = obj.GetType(); 
     PropertyInfo info = type.GetProperty(part); 
     if (info == null) { return null; } 

     obj = info.GetValue(obj, null); 
    } 
    return obj; 
} 

public static T GetPropValue<T>(this Object obj, String name) { 
    Object retval = GetPropValue(obj, name); 
    if (retval == null) { return default(T); } 

    // throws InvalidCastException if types are incompatible 
    return (T) retval; 
} 

diese benutzen:

DateTime now = DateTime.Now; 
int min = GetPropValue<int>(now, "TimeOfDay.Minutes"); 
int hrs = now.GetPropValue<int>("TimeOfDay.Hours"); 

diese link für Ihre Referenz.

+0

Danke dafür. Bedeutet das, dass ich die Objekthierarchie in "Name" angeben muss. Ich würde hoffen, nur "Shape" anzugeben, und es würde die Objekthierarchie suchen, um die Übereinstimmung des Vornamens zu finden. – SamJolly

+0

Ja. Beachten Sie, dass Sie keine doppelte Eigenschaft für eine Klasse haben können. Dies ist also kein Problem, wenn Sie über die Hierarchie skeptisch sind. – lexeRoy

Verwandte Themen