Можно ли использовать 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.

Другие вопросы по тегам