Привет! Я пытаюсь создать функцию, которая динамически создает делегата с тем же возвращаемым значением и теми же параметрами, что и для MethodInfo, который он получает в качестве параметра, а также, и это очень важно для тех же имен параметров!
То, что я до сих пор делал, - это создание функции, которая возвращает лямбду, которая получает те же типы параметров и имеет то же возвращаемое значение, что и MethodInfo, но не имеет имен параметров:
static void Example()
{
Person adam = new Person();
MethodInfo method = typeof(Person).GetMethod("Jump");
Delegate result = CreateDelegate(adam, method);
result.DynamicInvoke((uint)4, "Yeahaa");
}
private static Delegate CreateDelegate(object instance, MethodInfo method)
{
var parametersInfo = method.GetParameters();
Expression[] expArgs = new Expression[parametersInfo.Length];
List<ParameterExpression> lstParamExpressions = new List<ParameterExpression>();
for (int i = 0; i < expArgs.Length; i++)
{
expArgs[i] = Expression.Parameter(parametersInfo[i].ParameterType, parametersInfo[i].Name);
lstParamExpressions.Add((ParameterExpression)expArgs[i]);
}
MethodCallExpression callExpression = Expression.Call(Expression.Constant(instance), method, expArgs);
LambdaExpression lambdaExpression = Expression.Lambda(callExpression, lstParamExpressions);
return lambdaExpression.Compile();
}
private class Person
{
public void Jump(uint height, string cheer)
{
Console.WriteLine("Person jumped " + height + " "+ cheer);
}
}
Кто-нибудьесть предложения как я могу это сделать?Чтобы было понятно, причина, по которой я беспокоюсь об именах параметров, заключается в том, что я мог бы активировать делегат с именами параметров, чтобы я мог назвать его так (cheer = "YAY! ', Height = 3) (мое приложениеинтегрирован с Python, поэтому я смогу сделать это без DynamicInvoke, и это также причина, почему имена параметров так важны, а также почему я написал '=', а не ':')