Ho questa classe:
public class CustomerFilter
{
public int Id { get; set; }
public int Name { get; set; }
}
Ed è usato in questo modo:
public class Search
{
private Expression<Func<CustomerFilter, bool>> customerfilter;
public Expression<Func<CustomerFilter, bool>> CustomerFilter
{
set { customerfilter = value; }
}
}
var search = new Search();
search.CustomerFilter = (x => x.Id == 1);
Dall'interno della classe di ricerca, come posso ottenere il valore di una proprietà senza usare ExpressionVisitor
? Qualcosa di simile a:
var customerId = customerFilter.Id; //Or something similar
Se il tuo MemberExpression==ConstantExpression
CustomerFilter
supporta solo MemberExpression==ConstantExpression
come nel tuo codice di esempio. Quindi è possibile ottenere le informazioni direttamente dall'oggetto Expression
.
var propertyName = ((MemberExpression)((BinaryExpression)customerfilter.Body).Left).Member.Name;
var propertyValue = ((ConstantExpression)((BinaryExpression)customerfilter.Body).Right).Value;
Se si desidera supportare espressioni più complicate, è consigliabile utilizzare ExpressionVisitor
per analizzare l'albero delle expression
.