Ho un Expression<Func<Entity, string>>
che può essere sia una proprietà o di accesso di una proprietà nidificatoCome ri-avvolgere un Expression Linq albero
y => y.SearchColumn
o
y => y.SubItem.SubColumn
Sto costruendo un albero di espressione in modo dinamico e vorrei ottenere un InvokeExpression come questo
x => x.SearchColumn.Contains("foo");
x => x.Sub.SearchColumn.Contains("foo");
Sono quasi sicuro di poter scartare l'Expr corpo ESSIONE, quindi applicare parzialmente l'x ParameterExpression
ad esso, ma non riesco a capire i incantesimi magici per rendere questo accada
Così ho qualcosa di simile
Expression<Func<Entity, string>> createContains(Expression<Func<Entity, string>> accessor) {
var stringContains = typeof(String).GetMethod("Contains", new [] { typeof(String) });
var pe = Expression.Parameter(typeof(T), "__x4326");
return Expression.Lambda<Func<Entity, bool>>(
Expression.Call(
curryExpression(accessor.Body, pe),
stringContains,
Expression.Constant("foo")
)
, pe
);
}
static Expression curryExpression(Expression from, ParameterExpression parameter) {
// this doesn't handle the sub-property scenario
return Expression.Property(parameter, ((MemberExpression) from).Member.Name);
//I thought this would work but it does not
//return Expression.Lambda<Func<Entity,string>>(from, parameter).Body;
}
Edit: Here is the full thing I'm trying to do along with the error
Sì.La cosa importante da riconoscere è che gli alberi di espressione sono immutabili, quindi per poter modificare un pezzo di un albero di espressioni è necessario creare una copia completa di quell'albero dell'espressione con le parti chiave modificate, che è lo scopo di un ExpressionVisitor. – StriplingWarrior
Santa merda, fantastico Sergey. Sono contento di sapere che stavo vicino :) –