Erstellen Delegierten dynamisch mit dem parameter-Namen
Hallo, ich versuche eine Funktion erstellen, die dynamisch erstellt einen Delegaten mit der gleichen Rückgabewert und die gleichen Parameter wie eine MethodInfo-es erhält als parameter und auch und dies ist sehr wichtig, den gleichen Parameternamen!
Was ich Tat, so weit ist erstellen Sie eine Funktion zurückgibt, die einen lambda-Ausdruck, der erhält die gleichen parameter-Typen und hat denselben Rückgabewert wie die MethodInfo-aber es muss nicht die Namen der parameter:
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);
}
}
Hat jemand irgendwelche Vorschläge, wie ich das tun kann?
Um deutlich zu machen, der Grund, mich interessieren die Namen der parameter ist, so wäre ich in der Lage zu aktivieren die Delegierten mit den parameter-Namen, so könnte ich es nennen, wie dies (cheer="YAY!', Höhe=3)
(Meine Anwendung ist integriert mit Python, das ist, wie ich in der Lage sein, es zu tun, ohne DynamicInvoke und das ist auch der Grund, warum die Namen der parameter sind so wichtig
und auch, warum ich schrieb '=' und nicht ':')
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dynamisch erstellen Sie einen Delegaten, die Sie verwenden können, Reflexion.Aussenden. Da die Delegierten sind spezielle Typen .Net, der code zu erstellen, ist es nicht ganz offensichtlich ist. Das folgende basiert auf reflektierter code von Methoden, die von
Expression.Lambda()
. Es dient zum erstellen von benutzerdefinierten Delegaten-Typen in Situationen, wo es keineAction
oderFunc
Delegierten zur Verfügung (mehr als 17 Parameter oder Parameter mitref
oderout
).Wenn Sie sich sorgen über die performance, möchten Sie möglicherweise erstellen Sie einen cache von einigen Sortieren, so dass Sie nicht erstellen Sie die gleichen Delegaten-Typ über und über.
Die einzige änderung im code wird die Zeile, die erstellt
lambdaExpression
:Aber braucht man eigentlich nicht zu bewältigen
Expression
s bei allen.Delegieren.CreateDelegate()
ist genug:PersonJump
,PersonJump2
,PersonJump3
usw.Ich habe gerade stolperte über einen schönen Weg, um dieses Problem zu lösen, es sieht aus wie dieses für die Delegierten eine statische Methode:
Verwendet diese extension Methode:
Den open-source-framework ImpromptuInterface (v5.6.7 über nuget) hat das DLR currying/teilweise anwenden, - Implementierung, die ich denke würde in diesem Fall so lange, wie Sie nicht brauchen, eine wörtliche delegieren.
Hier ist die c# - version zu erstellen und die Berufung auf Sie:
So
jump
ist nicht eine wörtliche delegieren, Sie kann nicht reflektieren, aber Sie können es aufrufen, als ob es waren ein Delegierter und es ist ein DLR-Objekt, also meine Vermutung ist, dass es funktionieren würde, genau das gleiche in python.