我正在编写一个审核部分,并且我正在尝试使用属性将参数标记为应该在审核中记录的方法以获取其他信息。但是,无论出于何种原因,我似乎无法检查该属性是否存在。
我的代码:
[Audit(AuditType.GetReport)]
public Stream GetReportStream([AuditParameter] Report report)
{
...
}
[AttributeUsage(AttributeTargets.Parameter)]
public class AuditParameterAttribute : Attribute
{
}
而且,在拦截器里面,我试图得到它:
foreach (ParameterInfo param in invocation.Method.GetParameters ())
{
var atts = CustomAttributeData.GetCustomAttributes (param);
if (param.IsDefined (typeof(AuditParameterAttribute), false))
{
attributes.Add (param.Name, invocation.Arguments[param.Position].ToString ());
}
}
我开始添加一些额外的调用以尝试让某些东西起作用;为什么额外的var atts
就在那里。 invocation
变量包含有关被调用方法的信息,我能够获得一个表示参数的ParameterInfo对象。但是,无论我尝试过什么,我都无法从中获得任何自定义属性。
我在这里做错了什么?
答案 0 :(得分:2)
知道了。原来我使用Castle的经验不足是一个问题。我意识到它是通过基于被调用类的接口的代理,它没有我正在寻找的属性。所以,将我的代码更改为:
foreach (ParameterInfo param in invocation.MethodInvocationTarget.GetParameters ())
{
if (param.IsDefined (typeof(AuditParameterAttribute), false))
{
attributes.Add (param.Name, invocation.Arguments[param.Position].ToString ());
}
}
使用MethodInvocationTarget代替Method修复了问题。