Ejemplo n.º 1
0
        /// <summary>
        /// 加入SetAfter屬性掛勾
        /// </summary>
        /// <typeparam name="TProperty">屬性類型</typeparam>
        /// <param name="selector">屬性選擇器</param>
        /// <param name="callback">掛勾回呼</param>
        /// <returns>物件注射器</returns>
        public ObjectHookInjector <T> HookSetPropertyAfter <TProperty>(
            Expression <Func <T, TProperty> > selector,
            PropertyHookCallback <T> callback)
        {
            if (selector.Body.NodeType == ExpressionType.Call)
            {
                var methodCallExpression = selector.Body as MethodCallExpression;

                var property = typeof(T).GetProperties().Single(x => x.GetMethod == methodCallExpression.Method || x.SetMethod == methodCallExpression.Method);

                Interceptor.PropertyAfterCallbackDict[new HookMethodInfo()
                                                      {
                                                          Type = MethodType.IndexerSetter, Method = property.SetMethod
                                                      }] = callback;
            }
            else if (selector.Body.NodeType == ExpressionType.MemberAccess)
            {
                var memberException = selector.Body as MemberExpression;

                Interceptor.PropertyAfterCallbackDict[new HookMethodInfo()
                                                      {
                                                          Type = MethodType.PropertySetter, Method = ((PropertyInfo)memberException.Member).SetMethod
                                                      }] = callback;
            }

            return(this);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 加入GetAfter屬性掛勾
        /// </summary>
        /// <typeparam name="TProperty">屬性類型</typeparam>
        /// <param name="selector">屬性選擇器</param>
        /// <param name="callback">掛勾回呼</param>
        /// <returns>物件注射器</returns>
        public ObjectHookInjector <T> HookGetPropertyAfter <TProperty>(
            Expression <Func <T, TProperty> > selector,
            PropertyHookCallback <T> callback)
        {
            if (selector.Body.NodeType == ExpressionType.Call)
            {
                var methodCallExpression = selector.Body as MethodCallExpression;
                Interceptor.PropertyAfterCallbackDict[new HookMethodInfo()
                                                      {
                                                          Type = MethodType.IndexerGatter, Method = methodCallExpression.Method
                                                      }] = callback;
            }
            else if (selector.Body.NodeType == ExpressionType.MemberAccess)
            {
                var memberException = selector.Body as MemberExpression;
                Interceptor.PropertyAfterCallbackDict[new HookMethodInfo()
                                                      {
                                                          Type = MethodType.PropertyGatter, Method = ((PropertyInfo)memberException.Member).GetMethod
                                                      }] = callback;
            }

            return(this);
        }