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