c# - PostSharp 3.1 中的 CompileTimeInitialize 可以使用 Reflection 吗?

标签 c# postsharp

是否可以在 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/

相关文章:

c# - PostSharp 和 CaSTLe 动态代理有什么区别?

c# - 日志记录结构 - 当必须记录每个方法时如何构建?

c# - 如何设置默认的 NHibernate CommandTimeOut 默认值

c# - 纬度经度对的正则表达式

c# - 泛型和 Action 委托(delegate)

c# - 如何在 WPF 应用程序页面而不是窗口中禁用最大化按钮

c# - 如何使用属性名称和前缀从属性方面调用特定方法?

javascript - C# 和网站之间通过 localhost 进行套接字/通知

c# - 最长递增子序列的数量

dependency-injection - 使用上下文信息记录日志