是否可以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.locationInfo的RuntimeInitialize东西正常工作.
您可以在CompileTimeInitialize方法中使用反射,并且实际上locationInfo在该方法执行期间保存正确的信息。
但是,该locationInfo字段随后会被序列化,然后在运行时被反序列化。这就是问题发生的地方 - 显然,3.1 版本在这种特殊情况下引入了与序列化相关的错误。例如,您可以通过在字段中仅保存 locationInfo.Name 来进行检查。
这意味着您需要等待 3.1 中实现错误修复。您可能还想直接在PostSharp 支持论坛上报告错误。
更新:该问题已在 PostSharp 版本 3.1.30 中修复。