У меня есть рабочая установка, которая не сильно напечатана и зависит от отражения.
У меня есть класс, скажем
class Person{
public string FirstName {get ; set;}
public string LastName {get; set;}
public int Age {get; set;}
...
// some more public properties
}
и
class CellInfo {
public string Title {get; set;}
public string FormatString {get; set;}
}
и у меня есть словарь, подобный этому
Dictionary<string, CellInfo> fields = new Dictionary<string, CellInfo>();
fields.Add("FirstName", new CellInfo {Title = "First Name", FormatString = "Foo"});
fields.Add("LastName", new CellInfo {Title = "Last Name", FormatString = "Bar"});
Это простой словарь с именами свойств и некоторой информацией о них.
Я передаю словарь в другой модуль, который обрабатывает экземпляры Person, и я делаю
Dictionary<string, CellInfo> fields = SomeMethodToGetDictionary();
foreach(Person p in someCollection)
{
foreach(var field in fields)
{
object cellValue = type(Person).GetProperty(field.Key).GetValue(p, null);
// use cellValue and info on field from field.Value somewhere.
...
}
}
Этот метод передачи строки для имени поля и использования отражения работает, но мне было интересно, есть ли строго типизированный метод для этого.
Я имел в виду свойство, в котором хранится выражение linq, что-то вроде этого
fields.Add("FirstName", new CellInfo
{
Title = "First Name",
FormatString = "Foo",
EvalExpression = p => p.FirstName
});
и во время использования каким-либо образом используйте EvalExpression
на объекте person и получите значение свойства. Я понятия не имею, с чего начать и как будет выглядеть синтаксис, чтобы иметь такое свойство, которое можно оценить. Я новичок в функции делегатов и деревьев выражений, которые даже не знаю подходящих ключевых слов для поиска. Надеюсь, мое описание понятно; если нет, дайте мне знать, и я сообщу подробности по мере необходимости.
Любая помощь будет высоко ценится.