Я думаю, вы хотите это:
Action<T, object> setValue = (t, o) => property.GetSetMethod().Invoke(t, new object[] { o });
или
Action<T, object> setValue = (t, o) => property.SetValue(t, o, null);
EDIT
Чтобы проиллюстрировать предполагаемую худшую эффективность этого ответа по сравнению с принятым ответом, предположим этот метод:
void SetAnObjectPropertyOnALotOfObjects<T>(IEnumerable<T> objs)
{
//Create a delegate and assign a reference to that delegate to the setValue variable
Action<T, object> setValue = GetSetter();
foreach (var o in objs)
{
//invoke the delegate referred to by the setValue variable (that is, "invoke its referent"
setValue.Invoke(o, new object());
}
}
Ответ MerickOWA использует отражение в методе GetSetter
, поэтому мы предполагаем, что метод GetSetter
требует больше времени для выполнения, в его подходе. Этот ответ использует отражение каждый раз, когда мы вызываем setValue.Invoke
, поэтому мы предполагаем, что выполнение этого ответа занимает больше времени. Если мы предположим, что количество элементов в последовательности велико, для ответа MerickOWA потребуется меньше времени.
Например, предположим, что метод GetSetter MerickOWA занимает X миллисекунд больше, чем мой, в то время как мой делегат setValue занимает Y миллисекунд больше, чем его. Если в последовательности N элементов, то мое решение должно быть медленнее, чем его (N * Y - X) миллисекунд.