集合上的表达式树 'Any'
Expression Tree 'Any' on Collection
我正在尝试确定集合中的任何对象是否将目标 属性 设置为 true。我怎样才能做到这一点?这是我目前所拥有的:
public class AnyValidAttribute : ValidationAttribute
{
private static MethodInfo AnyMethod =
typeof(Enumerable)
.GetMethods()
.First(m => m.Name == "Any" && m.GetParameters().Length == 2));
string booleanPropertyToCheck;
Type entityType;
public AnyValidAttribute(string booleanPropertyToCheck, Type entityType)
{
this.booleanPropertyToCheck = booleanPropertyToCheck;
this.entityType = entityType;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var collection = new List<object>((IEnumerable<object>)value);
var propInfo = this.entityType.GetProperty(this.booleanPropertyToCheck);
var param = Expression.Parameter(this.entityType, "entity");
var property = Expression.MakeMemberAccess(param, propInfo);
var trueValue = Expression.Constant(true);
var comparison = Expression.Equal(property, trueValue);
var lambda = Expression.Lambda(comparison, param);
var call = Expression.Call(AnyMethod, comparison, lambda);
var anyTrue = ???
return true ? null : new ValidationResult("At least one is required.");
}
}
您想动态调用Any
方法吗?
我建议这样做:
var anyDelegate = lambda.Compile();
var genericMethod = AnyMethod.MakeGenericMethod(entityType);
var anyTrue = (bool)genericMethod.Invoke(null, new[] {value, genericMethod});
你真的不需要你的 Call
表达式。
在你的方法中完成调用就像(在 Linqpad 中对我有用):
var propInfo = this.entityType.GetProperty(this.booleanPropertyToCheck);
var param = Expression.Parameter(this.entityType, "entity");
var property = Expression.MakeMemberAccess(param, propInfo);
var trueValue = Expression.Constant(true);
var comparison = Expression.Equal(property, trueValue);
var lambda = Expression.Lambda(comparison, param);
var anyDelegate = lambda.Compile();
var genericMethod = AnyMethod.MakeGenericMethod(entityType);
var anyTrue = (bool)genericMethod.Invoke(null, new[] { value, anyDelegate });
我正在尝试确定集合中的任何对象是否将目标 属性 设置为 true。我怎样才能做到这一点?这是我目前所拥有的:
public class AnyValidAttribute : ValidationAttribute
{
private static MethodInfo AnyMethod =
typeof(Enumerable)
.GetMethods()
.First(m => m.Name == "Any" && m.GetParameters().Length == 2));
string booleanPropertyToCheck;
Type entityType;
public AnyValidAttribute(string booleanPropertyToCheck, Type entityType)
{
this.booleanPropertyToCheck = booleanPropertyToCheck;
this.entityType = entityType;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var collection = new List<object>((IEnumerable<object>)value);
var propInfo = this.entityType.GetProperty(this.booleanPropertyToCheck);
var param = Expression.Parameter(this.entityType, "entity");
var property = Expression.MakeMemberAccess(param, propInfo);
var trueValue = Expression.Constant(true);
var comparison = Expression.Equal(property, trueValue);
var lambda = Expression.Lambda(comparison, param);
var call = Expression.Call(AnyMethod, comparison, lambda);
var anyTrue = ???
return true ? null : new ValidationResult("At least one is required.");
}
}
您想动态调用Any
方法吗?
我建议这样做:
var anyDelegate = lambda.Compile();
var genericMethod = AnyMethod.MakeGenericMethod(entityType);
var anyTrue = (bool)genericMethod.Invoke(null, new[] {value, genericMethod});
你真的不需要你的 Call
表达式。
在你的方法中完成调用就像(在 Linqpad 中对我有用):
var propInfo = this.entityType.GetProperty(this.booleanPropertyToCheck);
var param = Expression.Parameter(this.entityType, "entity");
var property = Expression.MakeMemberAccess(param, propInfo);
var trueValue = Expression.Constant(true);
var comparison = Expression.Equal(property, trueValue);
var lambda = Expression.Lambda(comparison, param);
var anyDelegate = lambda.Compile();
var genericMethod = AnyMethod.MakeGenericMethod(entityType);
var anyTrue = (bool)genericMethod.Invoke(null, new[] { value, anyDelegate });