Ho un'espressione di chiamata di metodo e provo a richiamare il metodo. Ho trovato un modo, ma ho problemi nel recuperare i valori dei parametri poiché non tutti gli argomenti sono descritti con una espressione costante.Come chiamare il metodo da 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);
}
Inoltre, ho visto alcuni altri modi per richiamare il metodo, ora io non sono sicuro di quello che è il modo giusto per farlo.
var func = expression.Compile();
var success = func.Invoke();
Quindi la mia domanda è: come posso recuperare i valori metodo degli argomenti da methodCallExpression.Arguments
?
O c'è un modo più semplice per raggiungere il mio obiettivo?
Grazie, è molto più semplice. Lo sto facendo ora: // compila l'espressione lambda per ottenere il delegato per il richiamo. Azione action = selector.Compile(); // invocare l'espressione su ogni elemento all'interno dell'enumerabile foreach (articolo TSource nell'origine) { azione (elemento); E infine ho trovato anche la documentazione di msdn per questo problema: http://msdn.microsoft.com/en-us/library/bb882536.aspx –
Enyra
C'è un motivo per cui non si può semplicemente fare 'selector.Compile()() '? Perché "Invoke" o "DynamicInvoke" quando le parentesi funzionano? – ErikE