У нас есть некоторый код, который с помощью имени свойства использует отражение для реализации Comparer.
Я бы хотел сохранить делегат / функцию для получения значения, а не платить цену отражения каждый раз, когда нам нужно получить значение.
Учитывая класс как это:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Я пытался написать функцию, которая создала бы для меня делегат
Func<T, object> CreateGetFuncFor<T>(string propertyName)
{
PropertyInfo prop = typeof(T).GetProperty(propertyName);
return (Func<T, object>)Delegate.CreateDelegate(typeof(Func<T, object>),
null,
prop.GetGetMethod());
}
Следующий код отлично работает для получения имени
var person = new Person { Name = "Dave", Age = 42 };
var funcitonToGetName = CreateGetFuncFor<Person>("Name");
Console.WriteLine(funcitonToGetName(person));
var functionToGetAge = CreateGetFuncFor<Person>("Age");
но для свойства Age он генерирует ArgumentException с сообщением "Ошибка привязки к целевому методу"
Чего мне не хватает? Есть ли другой способ сделать это?