Я хочу записать вызов метода как выражение, но предварительно оценить его аргументы безопасным для типов и дружественным к среде IDE способом.
Взять следующий пример класса:
class Test
{
public string SomeMethod(int a, string b) { ... }
}
Теперь я хочу передать вызов SomeMethod
функции, получающей Expression
:
HandleMethodCall<Test>(test => test.SomeMethod("string".Length, 5.ToString()));
Прямо сейчас HandleMethodCall
имеет подпись
static void HandleMethodCall<T>(Expression<Func<T, object>> expr)
К сожалению, в в этом случае выражение, переданное в HandleMethodCall
, содержит не только test.SomeMethod()
, но и деревья выражений для аргументов.
Обходным решением будет разделить вызов метода и его аргументы на разные аргументы для HandleMethodCall
, но это приводит к потере безопасности во время компиляции и поддержки IDE для отображения имен аргументов.
Есть ли способ заставить компилятор оценивать части выражения перед тем, как поместить их в Expression
object?
Или, альтернативно, можно ли вручную вызвать оценку деревьев выражений для параметров метода?