是否可以在PostSharp 3.1的CompileTimeInitialize中使用反射?

以下代码在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,则正常工作。

最佳答案

您可以在CompileTimeInitialize方法中使用反射,实际上,locationInfo在该方法执行期间保存正确的信息。

但是,locationInfo字段随后被序列化,随后在运行时进行反序列化。这就是问题发生的地方-显然,在这种特殊情况下,版本3.1引入了与序列化相关的错误。例如,您可以通过在字段中仅保存locationInfo.Name来进行检查。

这意味着您需要等待3.1版中的错误修复。您可能还想直接在PostSharp support forum上报告错误。

更新:该问题已在PostSharp版本3.1.30中修复。

关于c# - 可以在PostSharp 3.1的CompileTimeInitialize中使用反射吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21417411/

10-13 08:09