#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 / … для получения подробной информации о том, как делать именно то, что вы хотите.