У меня есть выражение вызова метода и пытаюсь вызвать метод. Я понял способ, но у меня проблемы с получением значений параметров, так как не каждый аргумент описывается с помощью ConstantExpression.Как вызвать метод из MethodCallExpression в 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);
}
Кроме того, я видел некоторые другие способы, чтобы вызвать метод, теперь я не уверен, что это правильный способ сделать это.
var func = expression.Compile();
var success = func.Invoke();
Так что мой вопрос, как я могу получить значение аргумента метода из methodCallExpression.Arguments
?
Или есть более простой способ достичь моей цели?
Спасибо, это намного проще. Я делаю это следующим образом: // скомпилируем выражение лямбда, чтобы получить делегат для вызова. Действие action = selector.Compile(); // вызывать выражение для каждого элемента в перечисляемом foreach (элемент источника в источнике) { action (item); } И, наконец, я также нашел документацию по msdn для этой проблемы: http://msdn.microsoft.com/en-us/library/bb882536.aspx –
Enyra
Есть ли причина, по которой вы не можете просто сделать 'selector.Compile()() '? Почему 'Invoke' или' DynamicInvoke' при работе круглых скобок? – ErikE