是否可以在 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:如果我在 RuntimeInitialize
中设置 this.locationInfo
一切正常。
最佳答案
您可以在 CompileTimeInitialize
方法中使用反射,实际上,locationInfo
会在该方法执行期间保存正确的信息。
但是,locationInfo
字段随后被序列化,随后在运行时反序列化。这就是问题发生的地方 - 显然,3.1 版在这种特殊情况下引入了与序列化相关的错误。例如,您可以通过仅在字段中保存 locationInfo.Name 来检查这一点。
这意味着您需要等待 3.1 中的错误修复。您可能还想直接在 PostSharp support forum 上报告错误.
更新:此问题已在 PostSharp build 3.1.30 中修复。
关于c# - PostSharp 3.1 中的 CompileTimeInitialize 可以使用 Reflection 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21417411/