private InterceptMethodElement FindInterceptMethodElement(InterceptContractElement interceptContractElement, MethodInfo method) { if (interceptContractElement == null) { return(null); } if (interceptContractElement.Methods == null) { return(null); } foreach (InterceptMethodElement interceptMethodElement in interceptContractElement.Methods) { string methodSignature = null; if (method.IsGenericMethod) { methodSignature = method.GetGenericMethodDefinition().GetSignature(); } else { methodSignature = method.GetSignature(); } if (interceptMethodElement.Signature.Equals(methodSignature)) { return(interceptMethodElement); } } return(null); }
/// <summary> /// 返回一个<see cref ="System.String"/>值的列表,它表示通过给定方法引用的拦截器引用的类型. /// </summary> /// <param name="contractType">该方法的类型.</param> /// <param name="method">方法.</param> /// <returns>包含拦截器类型的<see cref ="System.String"/>值列表.</returns> public IEnumerable <string> GetInterceptorTypes(Type contractType, MethodInfo method) { if (this.Interception == null || this.Interception.Interceptors == null || this.Interception.Contracts == null) { return(null); } InterceptContractElement interceptContractElement = this.FindInterceptContractElement(contractType); if (interceptContractElement == null) { return(null); } InterceptMethodElement interceptMethodElement = this.FindInterceptMethodElement(interceptContractElement, method); if (interceptMethodElement == null) { return(null); } var interceptorRefNames = this.FindInterceptorRefNames(interceptMethodElement); if (interceptorRefNames == null || interceptorRefNames.Count() == 0) { return(null); } List <string> ret = new List <string>(); foreach (var interceptorRefName in interceptorRefNames) { var interceptorTypeName = this.FindInterceptorTypeNameByRefName(interceptorRefName); if (!string.IsNullOrEmpty(interceptorTypeName)) { ret.Add(interceptorTypeName); } } return(ret); }
/// <summary> /// Adds an interception reference to the specified contract and the method. /// </summary> /// <param name="contractType">The type of the contract.</param> /// <param name="method">The method.</param> /// <param name="name">The name of the interception reference.</param> public void AddInterceptorRef(Type contractType, MethodInfo method, string name) { if (this.config.Interception != null) { if (this.config.Interception.Contracts != null) { foreach (InterceptContractElement interceptContract in this.config.Interception.Contracts) { if (interceptContract.Type.Equals(contractType.AssemblyQualifiedName)) { if (interceptContract.Methods != null) { foreach (InterceptMethodElement interceptMethod in interceptContract.Methods) { if (interceptMethod.Signature.Equals(method.GetSignature())) { if (interceptMethod.InterceptorRefs != null) { foreach (InterceptorRefElement interceptorRef in interceptMethod.InterceptorRefs) { if (interceptorRef.Name.Equals(name)) { return; } } interceptMethod.InterceptorRefs.Add(new InterceptorRefElement { Name = name }); } else { interceptMethod.InterceptorRefs = new InterceptorRefElementCollection(); interceptMethod.InterceptorRefs.Add(new InterceptorRefElement { Name = name }); } return; } } InterceptMethodElement interceptMethodAdd = new InterceptMethodElement(); interceptMethodAdd.Signature = method.GetSignature(); interceptMethodAdd.InterceptorRefs = new InterceptorRefElementCollection(); interceptMethodAdd.InterceptorRefs.Add(new InterceptorRefElement { Name = name }); interceptContract.Methods.Add(interceptMethodAdd); } else { interceptContract.Methods = new InterceptMethodElementCollection(); InterceptMethodElement interceptMethodAdd = new InterceptMethodElement(); interceptMethodAdd.Signature = method.GetSignature(); interceptMethodAdd.InterceptorRefs = new InterceptorRefElementCollection(); interceptMethodAdd.InterceptorRefs.Add(new InterceptorRefElement { Name = name }); interceptContract.Methods.Add(interceptMethodAdd); } return; } } InterceptContractElement interceptContractAdd = new InterceptContractElement(); interceptContractAdd.Type = contractType.AssemblyQualifiedName; interceptContractAdd.Methods = new InterceptMethodElementCollection(); InterceptMethodElement interceptMethodAddToContract = new InterceptMethodElement(); interceptMethodAddToContract.Signature = method.GetSignature(); interceptMethodAddToContract.InterceptorRefs = new InterceptorRefElementCollection(); interceptMethodAddToContract.InterceptorRefs.Add(new InterceptorRefElement { Name = name }); interceptContractAdd.Methods.Add(interceptMethodAddToContract); this.config.Interception.Contracts.Add(interceptContractAdd); } else { this.config.Interception.Contracts = new InterceptContractElementCollection(); InterceptContractElement interceptContractAdd = new InterceptContractElement(); interceptContractAdd.Type = contractType.AssemblyQualifiedName; interceptContractAdd.Methods = new InterceptMethodElementCollection(); InterceptMethodElement interceptMethodAddToContract = new InterceptMethodElement(); interceptMethodAddToContract.Signature = method.GetSignature(); interceptMethodAddToContract.InterceptorRefs = new InterceptorRefElementCollection(); interceptMethodAddToContract.InterceptorRefs.Add(new InterceptorRefElement { Name = name }); interceptContractAdd.Methods.Add(interceptMethodAddToContract); this.config.Interception.Contracts.Add(interceptContractAdd); } } else { this.config.Interception = new InterceptionElement(); this.config.Interception.Contracts = new InterceptContractElementCollection(); InterceptContractElement interceptContractAdd = new InterceptContractElement(); interceptContractAdd.Type = contractType.AssemblyQualifiedName; interceptContractAdd.Methods = new InterceptMethodElementCollection(); InterceptMethodElement interceptMethodAddToContract = new InterceptMethodElement(); interceptMethodAddToContract.Signature = method.GetSignature(); interceptMethodAddToContract.InterceptorRefs = new InterceptorRefElementCollection(); interceptMethodAddToContract.InterceptorRefs.Add(new InterceptorRefElement { Name = name }); interceptContractAdd.Methods.Add(interceptMethodAddToContract); this.config.Interception.Contracts.Add(interceptContractAdd); } }