public void Intercept(IInvocation invocation) { var methodInfo = invocation.Method; Object[] attributes = methodInfo.GetCustomAttributes(true); var directoryAttri = attributes.SingleOrDefault(a => a is DirectoryAttribute) as DirectoryAttribute; var clusterAttri = attributes.SingleOrDefault(a => a is ClusterAttribute) as ClusterAttribute; var loadBalanceAttri = attributes.SingleOrDefault(a => a is LoadBalanceAttribute) as LoadBalanceAttribute; var protocolAttri = attributes.SingleOrDefault(a => a is ProtocolAttribute) as ProtocolAttribute; ConstructorInfo constr = protocolAttri.ContextType.GetConstructors()[0]; ParameterInfo[] parameters = constr.GetParameters(); object[] constrParamters = new Object[parameters.Length]; constrParamters[0] = new DirectoryContext(directoryAttri.Path, directoryAttri.Directory); constrParamters[1] = new ClusterContext(clusterAttri.Name); constrParamters[2] = new LoadBalanceContext(loadBalanceAttri.Name); for (var i = 3; i < parameters.Length; i++) { Object value = PropertyHelper.GetPropertyValue(protocolAttri.GetType(), protocolAttri, parameters[i].Name); constrParamters[i] = value; } var invokeContext = Activator.CreateInstance(protocolAttri.ContextType, constrParamters) as InvokerContext; invocation.SetArgumentValue(invocation.Arguments.Length - 1, invokeContext); invocation.Proceed(); }
public InvokerContext(DirectoryContext directoryContext, ClusterContext clusterContext, LoadBalanceContext loadBalanceContext) { this.Directory = directoryContext; this.Cluster = clusterContext; this.LoadBalance = loadBalanceContext; }