using System.Linq.Expressions;
public static void Main()
Console.WriteLine("Hello World");
Action<object[]> helloWorldMethod = ConvertDelegate((Action<string>)Console.WriteLine);
object[] arguments = new[]{ "Hello World" };
helloWorldMethod(arguments);
public static Action<object[]> ConvertDelegate(Delegate method)
var parametersInfo = method.Method.GetParameters();
var parameterExpression = Expression.Parameter(typeof(object[]));
Expression getActualParameterExpression(int index) => Expression.Convert(Expression.ArrayIndex(parameterExpression, Expression.Constant(index)), parametersInfo[index].ParameterType);
var actualParameters = Enumerable.Range(0, parametersInfo.Count()).Select(getActualParameterExpression);
var bodyExpression = Expression.Call(method.Method, actualParameters);
return Expression.Lambda<Action<object[]>>(bodyExpression, parameterExpression).Compile();