コード例 #1
0
        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));
        }
コード例 #2
0
        private readonly IMyDal dal;         //MyDal dal = new MyDal();

        public MyBll(IMyDal dal)
        {
            this.dal = dal;
        }