Ich habe ein Expression<Func<Entity, string>>
, die entweder eine Eigenschaft oder eine verschachtelte EigenschaftenaccessorWie neu wickeln eine Linq Expression Baum
y => y.SearchColumn
oder
y => y.SubItem.SubColumn
ich einen Ausdruck sein können Baum dynamisch am Aufbau und möchte eine InvokeExpression wie diese bekommen
x => x.SearchColumn.Contains("foo");
x => x.Sub.SearchColumn.Contains("foo");
Ich bin mir ziemlich sicher, dass ich den Ausdruck auspacken kann ITZUNG Körper, dann gelten teilweise die x ParameterExpression
es, aber ich kann nicht die magischen Beschwörungen herauszufinden, damit dies geschieht
So habe ich so etwas wie
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
Ja.Es ist wichtig zu erkennen, dass Ausdrucksbäume unveränderlich sind. Um also einen Teil eines Ausdrucksbaums zu ändern, müssen Sie eine vollständige Kopie dieses Ausdrucksbaums erstellen, wobei wichtige Teile davon geändert werden, was der Zweck eines ExpressionVisitors ist. – StriplingWarrior
Heiliger Mist, genial Sergey. Gut zu wissen, dass ich in der Nähe war :) –