2013-08-08 4 views
0

Я использую эту функцию:.GetProperty() может использовать для входа в собственность в отправленное свойство?

public static Object GetDate(this Object src, string propName) 
{ 
    return src.GetType().GetProperty(propName).GetValue(src, null); 
} 

Пусть отправленное PROPNAME = «Name» и ЦСИ, например, объект «человек». Эта функция работает отлично, потому что возвращаемое возвращаемое значение является значением поля «Имя» в «Лице». Но теперь мне нужно войти в собственность внутри другого свойства. Для примера, PROPNAME = "State.Country.Name"

(государство и страна и другие объекты) Тогда, если я использую функцию, передавая PROPNAME = "State.Country.Name" и SRC = Person (Persona является объектом) функции будет возвращено название страны?

+0

Нет; что вызовет исключение. Вам нужно разобрать строку и прокрутить свойства вручную. – SLaks

+0

Хорошо, спасибо! .. – Fco

+0

Вы можете посмотреть это сообщение: [Вложенное свойство] (http://stackoverflow.com/questions/1954746/using-reflection-in-c-sharp-to-get-properties-of-a-nested-object). У этого есть решение, в котором Вы нуждаетесь. – FelProNet

ответ

0

Остерегайтесь, это не проверено. Я не помню правильный синтаксис, но вы можете попробовать:

public static Object GetValue(this Object src) 
{ 
    return src.GetType().GetProperty(src.ToString()).GetValue(src, null); 
} 

В принципе, вы просто проездом экземпляр имущества метода расширения - см не имя свойства не передается:

Person p = new Person(); 
var personCountry = p.State.Country.GetValue(); 

Надеюсь, что это работает!

0

Это прекрасно работает:

static object GetData(object obj, string propName) 
    { 
     string[] propertyNames = propName.Split('.'); 

     foreach (string propertyName in propertyNames) 
     { 
      string name = propertyName; 
      var pi = obj 
       .GetType() 
       .GetProperties() 
       .SingleOrDefault(p => p.Name == name); 

      if (pi == null) 
      { 
       throw new Exception("Property not found"); 
      } 

      obj = pi.GetValue(obj); 
     } 
     return obj; 
    }