Вы можете сделать это следующим способом. Обратите внимание, что вы не можете создать обобщенный Action<...>
, используя этот метод, потому что, как вы говорите, типы не известны во время компиляции. Но это довольно близко.
public delegate void DynamicInvokeDelegate(params object[] args);
public static DynamicInvokeDelegate CreateDynamicInvokeDelegate(MethodInfo method, object instance) {
return args => method.Invoke(instance, args);
}
Если вам нужен делегат для возврата значения:
public delegate object DynamicInvokeWithReturnDelegate(params object[] args);
public static DynamicInvokeWithReturnDelegate CreateDynamicInvokeWithReturnDelegate(MethodInfo method, object instance) {
return args => method.Invoke(instance, args);
}
EDIT:
На самом деле, похоже, вам нужен этот код:
public static T GetDelegate<T>(MethodInfo method, object instance)
where T : class
{
return (T)(object)Delegate.CreateDelegate(typeof(T), instance, method);
}
Требуется приведение (object)
, так как компилятор не позволит вам приводить Delegate
к какому-либо случайному типу, и вы не можете ограничить T
быть делегатом. Приведение через объект удовлетворяет компилятору.