我试图枚举修饰方法的参数,以检索应用于这些参数的自定义属性,以确定特定值。
我的拦截器中有以下内容,它显示了我尝试使用的两种不同的方法,包括Retreiving和枚举GetParameters,但是一个使用IsDefined,另一个使用GetCustomAttributes:
public void Intercept(IInvocation invocation)
{
try
{
var parameters = invocation.Request.Method.GetParameters();
for (int index = 0; index < parameters.Length; index++)
{
foreach (var attrs in parameters[index]
.GetCustomAttributes(typeof(EmulatedUserAttribute), true))
{
}
}
foreach (var param in invocation.Request.Method.GetParameters())
{
if (param.IsDefined(typeof (EmulatedUserAttribute), false))
{
invocation.Request.Arguments[param.Position] = 12345;
}
}
invocation.Proceed();
}
catch(Exception ex)
{
throw;
}
}
我正在寻找的属性很简单,没有实现:
public class EmulatedUserAttribute : Attribute { }
和InterceptAttribute:
[AttributeUsage(AttributeTargets.Method)]
public class EmulateAttribute : InterceptAttribute
{
public override IInterceptor CreateInterceptor(IProxyRequest request)
{
return request.Context.Kernel.Get<IEmulateUserInterceptor>();
}
}
我拦截的方法:
[Emulate]
public virtual List<UserAssociation> GetAssociatedProviders([EmulatedUser] int userId)
{
return _assocProvAccountRepo.GetAssociatedProviders(userId);
}
正如您所看到的,我使用EmulatedUser属性和带有拦截器属性的方法修饰了userId。除了我在userId上看不到属性外,其他所有工作都正常。
为什么我无法看到该方法的自定义属性?我猜测它与方法不是真正的“调用目标”有关,但我没有看到任何解决方法。请帮忙!
答案 0 :(得分:1)
布兰登,
尝试使用此代码。我让它工作得很好。以下是我定义类的方法:
public class Interceptor : SimpleInterceptor
{
protected override void BeforeInvoke(IInvocation invocation)
{
var invokedMethod = invocation.Request.Method;
if (invokedMethod.IsDefined(typeof(EmulateAttribute), true))
{
var methodParameters = invokedMethod.GetParameters();
for (int i = 0; i < methodParameters.Length; i++)
{
var param = methodParameters[i];
if (param.IsDefined(typeof (EmulatedUserAttribute), true))
{
invocation.Request.Arguments[i] = 5678;
}
}
}
}
}
public interface IIntercepted
{
[Emulate]
void InterceptedMethod([EmulatedUser] int userId);
}
public class Intercepted : IIntercepted
{
[Emulate]
public void InterceptedMethod([EmulatedUser] int userId)
{
Console.WriteLine("UserID: {0}", userId);
}
}
我正在请求IIntercepted
而不是Intercepted
的实例。如果我要求具体类,拦截将无效。也许这可以让你走上正确的道路。
var kernel = new StandardKernel();
kernel.Bind<IIntercepted>().To<Intercepted>().Intercept().With<Interceptor>();
var target = kernel.Get<IIntercepted>();
target.InterceptedMethod(1234); // Outputs 5678