Можно ли использовать Reflection в CompileTimeInitialize в PostSharp 3.1?
Можно ли использовать отражение в CompileTimeInitialize
в PostSharp 3.1?
Следующий код работал в 3.0:
public class TestClass
{
public string TestField;
[TestAspect]
public void TestMethod() { }
}
public class TestAspect : OnMethodBoundaryAspect
{
private LocationInfo locationInfo;
public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo)
{
this.locationInfo = new LocationInfo(method.ReflectedType.GetField("TestField"));
}
public override void OnSuccess(MethodExecutionArgs args)
{
Console.WriteLine(this.locationInfo);
}
}
С обновлением 3.1, this.locationInfo
становится Missing Property
и доступ к любому из его свойств вызывает NullReferenceException
,
Я сделал это неправильно или это было изменено в обновлении 3.1? Если да, можете ли вы предложить мне правильный способ подойти к этому?
PS: если я установлю this.locationInfo
в RuntimeInitialize
все работает правильно.
1 ответ
Вы можете использовать отражение в CompileTimeInitialize
метод и, на самом деле, locationInfo
содержит правильную информацию во время выполнения этого метода.
Тем не менее locationInfo
поле затем сериализуется, а затем десериализуется во время выполнения. Вот где возникает проблема - очевидно, в версии 3.1 появилась ошибка, связанная с сериализацией в данном конкретном случае. Вы можете проверить это, сохранив, например, только locationInfo.Name в поле.
Это означает, что вам нужно подождать, пока исправление ошибки будет реализовано в 3.1. Вы также можете сообщить об ошибках непосредственно на форуме поддержки PostSharp.
Обновление: проблема была исправлена в PostSharp build 3.1.30.