Получить имя метода, в котором осуществляется доступ к свойству, и прочитать значение свойства

#postsharp

#postsharp

Вопрос:

Я хотел бы поместить атрибут аспекта PostSharp в одно свойство и узнать, из какого свойства метода был получен доступ и какое значение оно имело в то время. Возможно ли это с помощью PostSharp?

Пример

 static MyClass
{
[PostSharpAtrribute]
public string OutputFormat { get; set; }
}

public void Method1
{
MyClass.Instance.OutputFormat = "1";
}

public void Method2
{
MyClass.Instance.OutputFormat = "2";
}

public void Method3
{
MyClass.Instance.OutputFormat = "3";
}
  

Аспект PostSharp должен читать

 Method "Method1" executed, property has value OutputFormat = 1
Method "Method2" executed, property has value OutputFormat = 2
Method "Method3" executed, property has value OutputFormat = 3
  

Ответ №1:

Чтобы получить текущее значение (до изменения, вы просто используете аргументы.Значение, поскольку набор еще не произошел.

 [Serializable] 
public class MyPropertyAspect: LocationInterceptionAspect 
{ 
    public override void OnSetValue(LocationInterceptionArgs args) 
    { 
            object current = args.Value; //Set has not happened, remember this is an interception
            args.ProceedSetValue(); 

    }           
}
  

см. http://www.sharpcrafters.com/blog/post/Day-7-Interception-Aspects-e28093-Part-1.aspx и http://www.sharpcrafters.com/blog/post/Day-8-Interception-Aspects-e28093-Part-2.aspx

Чтобы определить вызывающего абонента, вам нужно будет пройти через стек вызовов с помощью StackTrace http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

 var st = new StackTrace();
st.GetFrame(1).GetMethod().Name; //Might also be frame 2
  

или просто добавьте аспект трассировки в свои методы (что IMO было бы лучше, чем отражать стек вызовов) http://www.sharpcrafters.com/blog/post/Day-4-OnMethodBoundaryAspect.aspx

Комментарии:

1. «Аспект трассировки в методе» — это то, что мне нужно, но как разделить данные между аспектами? Для получения записей метода будет использоваться метод onmethod boundaryaspect, а для чтения значений свойств — аспект LocationInterceptionAspect. Поэтому мне нужно будет выяснить в аспекте LocationInterceptionAspect, какая последняя запись была в аспекте onmethod boundaryaspect.

2. Для обмена данными между аспектами вам необходимо создать сложный аспект. См . sharpcrafters.com/blog/post / … для получения подробной информации о том, как делать именно то, что вы хотите.