Я застрял на этом часами. Все, что я хочу сделать, это построить дерево выражений, переписав это выражение с помощью Expression class APIs:Переписать выражение Lambda с помощью API System.Linq.Expressions
var Expression<Func<T, bool>> expr = x => x.SomeProperty == value;
То, что я получил до сих пор являются:
{
var param = Expression.Parameter(typeof(T), "x");
var lhs = Expression.Property(param, "SomeProperty");
var rhs = Expression.Constant(value, value.GetType());
return Expression.Call(typeof(object).GetMethod("Equals", BindingFlags.Static | BindingFlags.Public), lhs, rhs);
}
Это прекрасно работает, если T
примитивный тип или перечисление , Но я получил исключение, если T является ссылкой типа, class
и т.д.
Сообщение исключения:
Невозможно создать постоянное значение типа «
TypeName
». В этом контексте поддерживаются только примитивные типы или типы перечисления.
Заранее спасибо.
Из [docs] (https://msdn.microsoft.com/en-us/library/system.linq.expressions.constantexpression (v = vs.110) .aspx) Я бы предположил, что вы не можете создайте 'ConstantExpression' из ничего, кроме константы * компиляции *. Это согласуется с сообщением об ошибке, которое вы получаете, поскольку * примитивные типы и типы перечисления * являются единственными, которые поддерживают * compile time * константы. Откуда берется значение 'value'? –
Вы пытались использовать поиск дерева выражений рефлектора? http://blogs.msmvps.com/paulomorgado/2010/08/05/mastering-expression-trees-with-net-reflector/ – Hylaean
Значение является свойством DataContract. Он десериализуется WCF. Затем я использую десериализованный объект для создания выражения. –