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