Я выполняю некоторые работы в деревьях выражений. При вызове ToString() на дереве Expression, вы получите прекрасные немногих диагностического текст (здесь выборка):Обертка дерева выражений с помощью регистратора
((Param_0.Customer.LastName == "Doe")
AndAlso ((Param_0.Customer.FirstName == "John")
Or (Param_0.Customer.FirstName == "Jane")))
Так что я написал этот кусок кода, в попытке обернуть выражение с некоторыми протоколирование способность:
public Expression WithLog(Expression exp)
{
return Expression.Block(exp, Expression.Call(
typeof (Debug).GetMethod("Print",
new Type [] { typeof(string) }),
new [] { exp }));
}
Я наполовину ожидал, что вызов метода вывести использование ToString(), но я предполагаю, что это функция времени компиляции. Когда я это сделаю, я получаю сообщение об ошибке:
Expression of type 'System.Boolean' cannot be used for parameter of type 'System.String' of method 'Void Print(System.String)
Справедливо. Но когда я меняю это на это:
public Expression WithLog(Expression exp)
{
return Expression.Block(exp, Expression.Call(
typeof (Debug).GetMethod("Print",
new Type [] { typeof(string) }),
new [] { exp.ToString() }));
}
Не компилируется. Зачем? И что мне нужно сделать, чтобы исправить это?
Это не компилируется, потому что он ожидает массив 'Expression's, но вы даете ему массив строк. Вам нужно будет изменить его на выражение, которое вызывает 'ToString' на' Expression.Constant (exp) ' – Rob