Ich habe eine Methode Aufruf Ausdruck und versuchen, die Methode aufzurufen. Ich habe einen Weg gefunden, aber ich habe Probleme beim Abrufen der Parameterwerte, da nicht jedes Argument mit einem ConstantExpression beschrieben wird.So rufen Sie die Methode von einer MethodCallExpression in C#
Expression<Action<T>> = t => t.DoSomething(Par0, Par1, Par2);
MethodCallExpression methodCallExpression = selector.Body
as MethodCallExpression;
// get the information which is needed to invoke the method from the provided
// lambda expression.
MethodInfo methodInfo = methodCallExpression.Method;
object[] arguments = methodCallExpression.Arguments.OfType<ConstantExpression>()
.Select(p => p.Value).ToArray();
// invoke the expression on every item within the enumerable
foreach (TSource item in source)
{
methodInfo.Invoke(item, arguments);
}
Zusätzlich habe ich einige andere Wege gesehen, die Methode aufzurufen, jetzt bin ich nicht sicher, was der richtige Weg, es zu tun ist.
var func = expression.Compile();
var success = func.Invoke();
Also meine Frage ist, wie kann ich die Methode Argument Werte von methodCallExpression.Arguments
abrufen?
Oder gibt es einen einfacheren Weg, um mein Ziel zu erreichen?
Danke, das ist viel einfacher. Ich mache es jetzt so: // kompilieren Sie den Lambda-Ausdruck, um den Delegaten zum Aufrufen zu erhalten. Aktion action = selector.Compile(); // den Ausdruck für jedes Element innerhalb des Enumerable aufrufen foreach (TSource-Element in der Quelle) { action (item); } Und schließlich habe ich auch die msdn Dokumentation für dieses Problem gefunden: http://msdn.microsoft.com/en-us/library/bb882536.aspx –
Enyra
Gibt es einen Grund, Sie können nicht einfach 'selector.Compile tun()() '? Warum 'Invoke' oder' DynamicInvoke' wenn Klammern funktionieren? – ErikE