Tag: postharp

PostSharp如何在运行时知道某个方面是否应用于某个方法?

我正在实现PostSharp方面库,无法找到解决以下问题的方法。 假设我们有一个方面将应用于某些方法,而不会应用于其他方法。 我需要一些机制,我可以在运行时使用它来知道方面是否应用于方法。 具体来说, 在运行时确定某个方面是否应用于System.Reflection.MethodBase给定的特定方法的推荐方法是什么? 我想到的第一个解决方案是使PostSharp标记每个已被此方面修改的方法,并使用自定义属性并在运行时使用methodBase.CustomAttributes 。 这是解决问题的正确方法吗? 或者在PostSharp中已经有一个现成的或更优雅的解决方案。 另外,请注意首选的解决方案不需要付费的PostSharp许可证,因为Free Community Edition足以支持我当前的项目。 无论如何,讨论基于付费PostSharpfunction的解决方案也是非常有意义的。

为什么编译后代码注入比预编译代码注入更好?

所以我们都知道C#没有类似C的宏预处理器(这里有一个很好的线程)。 但是现在AOP正在获得牵引力,似乎我们开始使用后处理器来处理我们曾经使用预处理器的事情(请记住,我只是在使用PostSharp,所以可能不在)。 我是C#中属性的忠实粉丝,但是如果一个预处理器被遗漏了很多理由(作为一个前MFC用户,我仍然质疑但仍然接受)为什么编译后代码注入比预先更好?编译代码注入?

如何使用PostSharp实现延迟加载?

我想用PostSharp在属性上实现延迟加载。 简而言之,而不是写作 SomeType _field = null; private SomeType Field { get { if (_field == null) { _field = LongOperation(); } return _field; } } 我想写 [LazyLoadAspect] private object Field { get { return LongOperation(); } } 所以,我确定我需要在类中发出一些代码来生成支持字段,以及在getter方法中为了实现测试。 使用PostSharp,我正在考虑重写CompileTimeInitialize ,但我错过了处理已编译代码的知识。 编辑:问题可以扩展到任何无参数的方法,如: SomeType _lazyLoadedField = null; SomeType LazyLoadableMethod () { if(_lazyLoadedField ==null) { // Long operations […]

PostSharp将k__Backing字段插入实体类,导致数据库生成失败

我正在使用C#中的Microsoft Entity Framework和CodeFirst创建数据库。 我想在WPF应用程序中使用数据库,因此实体类应该实现“INotifyPropertyChanged”。 这可以使用PostSharp方面非常优雅地完成,PostSharp方面每次属性更改时自动触发PropertyChanged事件。 如果我创建这样的方面并在我的实体类上使用它,我在尝试创建数据库时会得到以下例外: \tSystem.Data.Entity.Edm.EdmNavigationProperty: Name: The specified name is not allowed: ‘k__BackingField’. 显然,PostSharp会创建一个名为“k__BackingField”的属性,导致数据库创建失败,因为从EntityFramework的角度来看,它是一个无效的名称。 有没有办法绕过这个错误而不在每个实体类中手动实现“INotifyPropertyChanged”? PS:英语不是我的母语,如果你告诉我发帖中可能出现的错误,我将非常感激。 先感谢您

如何编写PostSharp Invoke方面以简化跨线程控制更新

当我想跨线程更新控件时,我通常最终会这样做: this.Invoke((MethodInvoker)delegate { SomeProcedure(); }); 建议的方法实际上就是调用你想要更新的特定控件的调用者,但99%的时候表单(即我的例子中的’this’)和控件都将在同一个控件上创建线程所以我真的很喜欢这样做,为了简单起见。 我在想,如果我只是将一个PostSharp方面置于SomeProcedure之上,将它包含在我的那个混乱的声明中,这将是很好的。 然后去…(哦是啊,第一个可用的答案100奖金点:)

在程序集上的PostSharp我没有源代码

在他们网站上的示例中,PostSharp有一个拦截主系统程序集中的调用的演示。 我已经尝试了几次设置和复制所有拦截调用程序集我没有源代码没有成功。 我的方法是简单地将程序集级属性放在我想要检测的命名空间和方法上。 这从来没有对我有用。 就像是: [assembly:Trace(“MyCategory”,AttributeTargetTypes =“My.BusinessLayer。*”)] 我在这里错过了什么吗? 如果我没有为其提供源代码,我是否可以不在程序集上对我的检测方面进行运行时注入? 我以为我可以做运行时注射…… 谢谢。