Вы можете использовать класс Expression со статическими методами для выполнения во время выполнения.
Приведенный ниже код предназначен для создания делегата, принимающего один аргумент с именем value типа int
, Он читается снизу вверх, поэтому такая строка звучит так:
var method = LambdaExpression.Lambda(orExp, Expression.Parameter(typeof(int), "value"));
тело метода сравнивает значение параметра с вызовом метода Bar вновь созданного объекта типа foo
var exp2 = Expression.Equal(Expression.Parameter(typeof(int), "value"), Expression.Property(Expression.New(typeof(Foo).GetConstructor(new Type[] { })), "Bar"));
Затем создается похожее выражение и / или их
var orExp = Expression.OrElse(exp1, exp2);
Последняя вещь - это вызов для компиляции. Этот вызов генерирует делегат, который может использоваться в вашем вызове метода where.
надеюсь, это поможет мне на 100% не быть уверенным в выражении, чтобы получить значение из параметра
var exp1 = Expression.Equal(Expression.Parameter(typeof(int),"value"), Expression.Property(Expression.New(typeof(Bar).GetConstructor(new Type[] { })), "Foo"));
var exp2 = Expression.Equal(Expression.Parameter(typeof(int), "value"), Expression.Property(Expression.New(typeof(Foo).GetConstructor(new Type[] { })), "Bar"));
var orExp = Expression.OrElse(exp1, exp2);
var method = LambdaExpression.Lambda(orExp, Expression.Parameter(typeof(int), "value"));
method.Compile();
Возможно, вы захотите посмотреть вызов для вызова вместо компиляции выражения, если вам нужно, чтобы выражение LambdaExpression было переведено во что-то отличное от двоичного кода (например, в оператор SQL)