Я предполагаю, что
caseConductor.SomeCleverFunction
не является статическим методом и имеет доступ к объекту Person и самому объекту Person, если оно является публичным свойством.
Я также предполагаю, что вы хотите передать строку типа "prop.address.street", где каждое вспомогательное свойство является классом, который содержит свойство puplic с таким именем
- Разделить строку ввода на период, найти самую левую строку
- Используйте отражение, чтобы получить список свойств (typeof (caseconductor) .GetProperties ())
- Найдите соответствующее свойство, вызовите для него метод GetValue, передав последний известный твердый объект (начиная с 'this') и сохранив ссылку на него.
- если в строке осталось больше под-свойств, повторите шаг 1, удалив самую левую часть строки.
- в противном случае вызовите GetValue () для свойства, используя последний объект возврата GetValue (), полученный на шаге 3, и верните его.
Что-то вроде:
"prop.address.street" -> найти свойство "prop" из 'this' и GetValue,
еще больше ".", Поэтому повторите, сохраняя возвращаемое значение
"address.street" -> найти свойство "address" из последнего возвращенного GetValue и получить его значение.
еще больше ".", Поэтому повторите, сохраняя возвращаемое значение
"улица" -> найти свойство "улица" из последнего возвращенного GetValue и вернуть его значение.
Конец строки, возвращает последнее значение
Редактировать -
Это довольно грубо, но добавьте его в LinqPAD и посмотрите.
http://www.linqpad.net/
Edit # 2 - вы должны иметь возможность индексировать массивы, используя синтаксис ^ ниже.
Опять же, это очень грубо, достаточно, чтобы получить рабочий пример.
Edit # 3 - Немного очистил пример и изменил его с моих классов-примеров на ваши.
void Main()
{
//- Load a caseConductor
var caseConductor = new CaseConductor();
caseConductor.CaseID = "A00001";
// person
caseConductor.Person = new Person();
caseConductor.Person.Surname = "Smith" ;
caseConductor.Person.DOB = DateTime.Now ;
// case note list
caseConductor.CaseNoteList = new List<Note>();
caseConductor.CaseNoteList.Add(new Note { NoteText = "A-1" , NoteDt = DateTime.Now });
caseConductor.CaseNoteList.Add(new Note { NoteText = "B-2", NoteDt = DateTime.Now });
// I could do this ...
string val1 = caseConductor.GetPropertyValue<string>("Person.Surname");
// or this ...
Note val2 = caseConductor.GetPropertyValue<Note>("CaseNoteList^1");
val1.Dump("val1"); //this is a string
val2.Dump("val2"); //this is a Note
}
public static class extensions
{
public static T GetPropertyValue<T>(this object o,string Properties) where T:class
{
var properties = Properties.Split('.');
var indexsplit = properties[0].Split('^');
var current = indexsplit[0];
var prop = (from p in o.GetType().GetProperties() where p.Name == current select p).Take(1).Single();
var val = prop.GetValue(o,null);
if(indexsplit.Length>1)
{
var index = int.Parse(indexsplit[1]);
IList ival = (IList)val;
val = ival[index];
}
if(properties[0] == Properties)
return (T)val;
else
return val.GetPropertyValue<T>(Properties.Replace(properties[0]+".",""));
}
}
class Note
{
public Guid NoteID { get; set; }
public string NoteText { get; set; }
public DateTime? NoteDt { get; set; }
}
public class Person
{
public Guid PersonID { get; set; }
public string Surname { get; set; }
public string Forename { get; set; }
public DateTime? DOB { get; set; }
}
class CaseConductor
{
public String CaseID{get;set;}
public Person Person { get; set; }
public List<Note> CaseNoteList { get; set; }
}