public static IEnumerable <T> Where <T>( this IMyDal <T> dal, Expression <Func <T, bool> > predicate) { BinaryExpression be = predicate.Body as BinaryExpression; var me = be.Left as MemberExpression; if (me == null) { throw new InvalidOperationException("don't be silly"); } if (me.Expression != predicate.Parameters[0]) { throw new InvalidOperationException("direct properties only, please!"); } string member = me.Member.Name; object value; switch (be.Right.NodeType) { case ExpressionType.Constant: value = ((ConstantExpression)be.Right).Value; break; case ExpressionType.MemberAccess: var constMemberAccess = ((MemberExpression)be.Right); var capture = ((ConstantExpression)constMemberAccess.Expression).Value; switch (constMemberAccess.Member.MemberType) { case MemberTypes.Field: value = ((FieldInfo)constMemberAccess.Member).GetValue(capture); break; case MemberTypes.Property: value = ((PropertyInfo)constMemberAccess.Member).GetValue(capture, null); break; default: throw new InvalidOperationException("simple captures only, please"); } break; default: throw new InvalidOperationException("more complexity"); } return(dal.Find(member, value)); }
private readonly IMyDal dal; //MyDal dal = new MyDal(); public MyBll(IMyDal dal) { this.dal = dal; }