Hola, estoy tratando de crear una función que crea dinámicamente un delegado con el mismo valor de retorno y los mismos parámetros que MethodInfo recibe como parámetro y también y es muy importante el mismo nombre de parámetro !Crear delegados dinámicamente con los nombres de los parámetros
Lo que hice hasta ahora es crear una función que devuelve un lambda que recibe los mismos tipos de parámetros y tiene el mismo valor de retorno como el MethodInfo pero no tiene los nombres de los parámetros:
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);
}
}
¿El Alguien tiene alguna sugerencia de cómo puedo hacer eso? Para dejar en claro, el motivo por el que me importan los nombres de los parámetros es para poder activar el delegado con los nombres de los parámetros, así podría llamarlo así (cheer = "YAY! ', Height = 3) (Mi aplicación está integrada con Python, así es como podré hacerlo sin DynamicInvoke y esta es también la razón por la cual los nombres de los parámetros son tan importantes y también por qué escribí '=' y no ':')
Gracias I lo intenté temprano hoy y funcionó muy bien !! Entiendo la mayor parte de tu código, pero realmente no pude entender qué es lo que estás haciendo con el nombre y la Base de nombres, ¿por qué es igual al nombre de la base tipo + el nombre del tipo, para qué sirve el número = 2? De todos modos muchas gracias, estaba tratando de hacerlo funcionar por días –
@UchihaMadara, es solo una manera de asegurarse de que el nombre del tipo sea único, porque no puede tener dos tipos con el mismo nombre en el mismo ensamblaje. Y el número 2 está ahí para que los nombres sean como 'PersonJump',' PersonJump2', 'PersonJump3', etc. – svick
Veo que es muy inteligente, ¡gracias! =] –