2013-04-16 11 views
5

Mam zagnieżdżony zestaw obiektów, tj. Niektóre właściwości są niestandardowymi obiektami. Chciałbym uzyskać wartość właściwości obiektu w obrębie grupy hierarchii za pomocą ciągu znaków dla nazwy właściwości i pewnej postaci metody "znajdź", aby zeskanować hierarchię w celu znalezienia właściwości o pasującej nazwie i uzyskać jej wartość.Jak znaleźć wartość właściwości obiektu z zagnieżdżonej grupy obiektowej, używając ciągu znaków jako nazwy właściwości?

Czy to możliwe, a jeśli tak, to w jaki sposób?

Wielkie dzięki.

EDIT

definicja klasy mogą być w Pseudokod:

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" 

Wszystko trochę wydumane, ale mogę „znaleźć” wartości nieruchomości „kształt” za pomocą magicznego ciąg „Shape” w jakiejś formie funkcji find, zaczynając od najwyższego obiektu. tj:

string myResult = myCar.FindPropertyValue("Shape") 

Mam nadzieję myResult = "okrągłe".

Oto, czego szukam.

Dzięki.

+1

postarać się o bardziej szczegółowe –

+1

użyć refleksji i 'PropertyInfo' http://stackoverflow.com/questions/1355090/using-propertyinfo-getvalue –

+0

Wystarczy dodał edytować za pomocą przykładu. Czy to zmienia odpowiedź odbicia? Radzenie sobie z zagnieżdżaniem jest ważne. – SamJolly

Odpowiedz

9

Na podstawie klas, które pokazałeś w pytaniu, potrzebujesz rekurencyjnego wywołania do iteracji właściwości obiektu. Jak o czymś można ponownie użyć:

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 jest własnością szukasz. Można wykorzystać to tak:

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

Tak, jest to możliwe.

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

Aby tego używać:

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

zobaczyć ten link w celach informacyjnych.

+0

Dzięki za to. Czy to oznacza, że ​​muszę określić hierarchię obiektów w "Nazwa". Mam nadzieję, że po prostu określę "Kształt" i przeszuka hierarchię obiektów, aby znaleźć dopasowanie nazwy. – SamJolly

+0

Tak. weź pod uwagę, że nie możesz mieć duplikatu na klasie, więc nie będzie to problemem, jeśli jesteś sceptycznie nastawiony do hierarchii. – lexeRoy

Powiązane problemy