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);
}