Создание делегатов динамически с именами параметров

Привет Я пытаюсь создать функцию, которая динамически создает делегат с тем же возвращаемым значением и теми же параметрами, что и 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, и это также причина, почему имена параметров так важны. а также почему я написал '=', а не ':')

7
задан Uchiha Madara 29 February 2012 в 19:07
поделиться