Это то, что можно опубликовать в Code Review, и на самом деле я уже разместил аналогичный вопрос . Я считаю, что мой подход, использующий деревья выражений, уже улучшает ваш подход.
Пример использования:
Action<object> compatibleExecute =
DelegateHelper.CreateCompatibleDelegate<Action<object>>( owner, method );
Преобразования выполняются при необходимости. Метод, переданный здесь функции, может иметь любой тип параметра.
UPDATE:
Я не проверял это, но в вашем случае вы можете попробовать следующее:
Func<object> getter =
DelegateHelper.CreateCompatibleDelegate<Func<object>>( owner, method );
method
должен быть установлен для получателя, который вы получили. owner
должен быть установлен на экземпляр вашего объекта. Если вы хотите разрешить делегату передать владельца в качестве аргумента, вам придется скорректировать код. Пример приведен Владимиром Матвеевым в качестве комментария к статье Джона Скита .
static Func<T, object, object> MagicMethod<T>(MethodInfo method)
{
var parameter = method.GetParameters().Single();
var instance = Expression.Parameter(typeof (T), "instance");
var argument = Expression.Parameter(typeof (object), "argument");
var methodCall = Expression.Call(
instance,
method,
Expression.Convert(argument, parameter.ParameterType)
);
return Expression.Lambda<Func<T, object, object>>(
Expression.Convert(methodCall, typeof (object)),
instance, argument
).Compile();
}