2012-04-18 3 views
0

Я работаю над частью аудита и пытаюсь использовать атрибут для отметки параметров для метода, который должен быть записан в аудите для получения дополнительной информации. Однако по какой-то причине я не могу проверить, существует ли атрибут.Атрибут параметра не отображается

Мой код:

[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, представляющий параметр из него. Но, независимо от того, что я пробовал, я никогда не получаю никаких пользовательских атрибутов.

Что я здесь делаю неправильно?

ответ

2

Got it. Оказывается, это была проблема с моей неопытности с использованием Castle. Я понял, что он прошел через прокси-сервер, основанный на интерфейсе для вызываемого класса, у которого не было атрибута, который я искал. Таким образом, сменив мой код на это:

foreach (ParameterInfo param in invocation.MethodInvocationTarget.GetParameters()) 
{ 
    if (param.IsDefined (typeof(AuditParameterAttribute), false)) 
    { 
     attributes.Add (param.Name, invocation.Arguments[param.Position].ToString()); 
    } 
} 

Использование MethodInvocationTarget вместо метода устраняет проблему.

Смежные вопросы