Ciao Sto cercando di creare una funzione che crea dinamicamente un delegato con lo stesso valore di ritorno e gli stessi parametri di un MethodInfo che riceve come parametro e anche e questo è molto importante gli stessi nomi dei parametri !Creazione delegati dinamicamente con nomi parametro
Quello che ho fatto finora è creare una funzione che restituisce un lambda che riceve gli stessi tipi di parametri e ha lo stesso valore di ritorno come il MethodInfo, ma non ha i nomi dei parametri:
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);
}
}
fa Qualcuno ha qualche suggerimento su come posso farlo? Per chiarire, il motivo per cui mi interessa dei nomi dei parametri è che sarei in grado di attivare il delegato con i nomi dei parametri, quindi potrei chiamarlo così (cheer = "YAY!", Height = 3) (La mia applicazione è integrata con Python è così che potrò farlo senza DynamicInvoke e questo è anche il motivo per cui i nomi dei parametri sono così importanti e anche perché ho scritto '=' e non ':')
Grazie I l'ho provato prima oggi e ha funzionato benissimo !! Capisco la maggior parte del tuo codice, ma non riesco davvero a capire cosa stai facendo con il nome e il nomeBase, perché è uguale al nome del tipo di base + il nome del tipo, qual è il numero = 2 per? Comunque grazie mille stavo cercando di farlo funzionare per giorni –
@UchihaMadara, è solo un modo per assicurarsi che il nome del tipo sia unico, perché non è possibile avere due tipi con lo stesso nome nello stesso assembly. E il numero 2 è lì in modo che i nomi siano come 'PersonJump',' PersonJump2', 'PersonJump3', ecc. – svick
Vedo che è molto intelligente, grazie! =] –