可以在PostSharp 3.1中的CompileTimeInitialize中使用Reflection吗?

Pet*_*Han 5 c# postsharp

是否可以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);
    }
}
Run Code Online (Sandbox Code Playgroud)

随着3.1升级,this.locationInfo成为Missing Property并访问其任何属性的原因NullReferenceException.

我这样做是错误的还是在3.1升级中改变了?如果是这样,你能否建议我采取正确的方法来解决这个问题?

PS:如果我设置this.locationInfoRuntimeInitialize东西正常工作.

Ale*_*exD 4

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

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

这意味着您需要等待 3.1 中实现错误修复。您可能还想直接在PostSharp 支持论坛上报告错误。

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