C# 在System.Linq.Expressions.Expression中添加和不添加,是否可能?

C# 在System.Linq.Expressions.Expression中添加和不添加,是否可能?,c#,linq,expression,C#,Linq,Expression,我正在尝试在和表达式操作中创建一个,或者本质上扩展System.Linq.Expressions.Expression,以便能够检查属性值是否在属性值列表中,但我不知道这是否可行 我在读,它说“没有办法执行一系列任意操作”。我不知道是否有可能创建这些新的操作,或者从哪里开始。任何帮助或暗示都将不胜感激 public static BinaryExpression MakeBinary( ExpressionType binaryType, Expression left, Exp

我正在尝试在和表达式操作中创建一个
,或者本质上扩展
System.Linq.Expressions.Expression
,以便能够检查属性值是否在属性值列表中,但我不知道这是否可行

我在读,它说“没有办法执行一系列任意操作”。我不知道是否有可能创建这些新的操作,或者从哪里开始。任何帮助或暗示都将不胜感激

public static BinaryExpression MakeBinary(
  ExpressionType binaryType, 
  Expression left, 
  Expression right)

您可以只调用
枚举.Contains
方法

static Expression<Func<IEnumerable<string>, bool>> containsExpr = en => en.Contains(null);
static MethodInfo containsMethodInfo = ((MethodCallExpression)containsExpr.Body).Method.GetGenericMethodDefinition();

public static Expression In(this Expression value, Expression arrayOfValues)
{
    return Expression.Call(containsMethodInfo.MakeGenericMethod(arrayOfValues.Type.GetElementType()),
            arrayOfValues, value);
}

public static Expression NotIn(this Expression value, Expression arrayOfValues)
{
    return Expression.Not(In(value, arrayOfValues));
}

这假定类型是一个数组,而不仅仅是任何旧的
IEnumerable
。如果必须使用任何旧的
IEnumerable
,则必须更改
arrayOfValues.Type.GetElementType()
指向接受
arrayOfValues的对象。键入
并在其上找到适当的
IEnumerable
实现,然后从该接口返回泛型参数。

提供一个示例,说明如何使用此函数以及希望它输出什么。因此,您有一个表达式您需要一个对象
foo
,一个表达式,该表达式为
foo
类型提供一个属性
Bar
,一个表达式
values
,该表达式为
Bar
返回的类型提供一个数组,您需要一个表达式来检查
values.Contains是否包含(foo.Bar)?还是我误解了?是的,你没有误解。
public class Foo { public int FooValue { get; set; } }

public void ExpressionInArray()
{
    var propertyReference = MemberExpression.Property(Expression.Constant(new Foo() { FooValue = 3 }), "FooValue");
    var validValues = Expression.Constant(new[] { 3, 4, 5 });
    var invalidValues = Expression.Constant(new[] { 6, 7, 8 });

    var expressionEvaluatingToTrue = propertyReference.In(validValues);
    var expressionEvaluatingToFalse = propertyReference.In(invalidValues);

    var expressionEvaluatingToTrue2 = propertyReference.NotIn(invalidValues);
    var expressionEvaluatingToFalse2 = propertyReference.NotIn(validValues);
}