コード例 #1
0
ファイル: Proxy.cs プロジェクト: kouweizhong/fluentAOP
        public T Save()
        {
            try
            {
                if (proxy == null)
                {
                    Confirm.Assertion(register.Keys.Count > 0, "Proxy definition must specify what members have to be intercepted. Specify one or more members utilizing Intercept*() methods.");
                    Confirm.Assertion(register.All(vp => vp.Value.Count > 0), "One or more intercepted members do not specify how to handle interception. Specify interception behavior utilizing On*() methods.");
                    states = new InterceptorStateCollection();
                    foreach (var key in register.Keys)
                    {
                        states.Add(new InterceptorState(key, register[key]));
                    }
                    context = new InterceptorContext(states);
                    proxy   = (target == null) ?
                              CilBuilder.Create <T>(context, implementedTypes.ToArray()) :
                              CilBuilder.Create <T>(target, context, implementedTypes.ToArray());
                }
            }
            catch (Exception ex)
            {
                throw new ProxyInitializationException("Unable to create proxy: " + ex.Message, ex);
            }

            return(proxy);
        }
コード例 #2
0
        /// <summary>
        /// Gets the method expression.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="expression">The expression.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">The <paramref name="expression"/> is <c>null</c>.</exception>
        /// <exception cref="System.InvalidOperationException">Method expected:  + expression.Body</exception>
        public static MethodCallExpression GetMethodExpression <T>(this Expression <Func <T, object> > expression)
        {
            Argument.IsNotNull(() => expression);

            switch (expression.Body.NodeType)
            {
            case ExpressionType.Call:
                return((MethodCallExpression)expression.Body);

            case ExpressionType.Convert:
                var unaryExpression = expression.Body as UnaryExpression;
                Confirm.Assertion(unaryExpression != null && unaryExpression.Operand is MethodCallExpression, string.Format("Method expected: {0}", unaryExpression.Operand));
                return(unaryExpression.Operand as MethodCallExpression);

            default:
                throw new InvalidOperationException(string.Format("Method expected: {0}", expression.Body));
            }
        }
コード例 #3
0
        /// <summary>
        /// Gets the member expression.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="expression">The expression.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">The <paramref name="expression"/> is <c>null</c>.</exception>
        /// <exception cref="System.ArgumentException">Property expected</exception>
        public static MemberExpression GetMemberExpression <T>(this Expression <Func <T, object> > expression)
        {
            Argument.IsNotNull(() => expression);

            switch (expression.Body.NodeType)
            {
            case ExpressionType.MemberAccess:
                return(expression.Body as MemberExpression);

            case ExpressionType.Convert:
                var unaryExpression = expression.Body as UnaryExpression;
                if (unaryExpression != null)
                {
                    Confirm.Assertion(unaryExpression.Operand is MemberExpression, string.Format("Property expected: {0}", unaryExpression.Operand));
                }
                return(((UnaryExpression)expression.Body).Operand as MemberExpression);

            default:
                throw new ArgumentException(@"Property expected", expression.Body.ToString());
            }
        }