我有一个简单的方面:
[System.Serializable()]
[System.AttributeUsage(System.AttributeTargets.Assembly)]
[PostSharp.Extensibility.MulticastAttributeUsage(PostSharp.Extensibility.MulticastTargets.Method)]
public class NullableMethodCallAspect : PostSharp.Aspects.MethodInterceptionAspect
{
public override void OnInvoke(PostSharp.Aspects.MethodInterceptionArgs args)
{
if (args.Instance != null)
args.Proceed();
}
}
我的解决方案中有两个项目:UI
和UIAppearanceExtensibility
(由UI
引用)。
在第二个中,我声明了一些接口,以便其他开发人员使用它们根据这些接口创建多个实现。
从UI
开始,我声明了这些接口的属性,例如IInterface1
。
所以,从我的UI项目(程序集)开始,我需要将我的方面应用于每次调用IInterface1
个对象......
我试过了,但是,它不起作用:
[assembly: UI.Aspects.NullableMethodCallAspect(
AttributeTargetAssemblies = "UIAppearanceExtensibility",
AttributeTargetTypes = "UI.Appearance.Extensibility.Triage.*",
AttributeTargetMembers = "regex: handle*"
)]
答案 0 :(得分:1)
在所示示例中,对接口成员的调用将在UI程序集中被截获,但仅在通过接口类型的变量访问它们时才会被截获。
例如:
// Interface in UIAppearanceExtensibility
public interface IInterface1
{
void Method1();
}
// Class in UI
public class Class1 : IInterface1
{
// ...
}
// This usage in UI will be intercepted
IInterface1 i1 = new Class1();
i1.Method1();
// This usage in UI will not be intercepted
Class1 c1 = new Class1();
c1.Method1();
原因是编译器在第二种情况下生成的IL代码没有引用IInterface1
,PostSharp在应用方面时正在寻找IInterface1
的用法。
在您的情况下,最好将方面应用于UIAppearanceExtensibility
程序集本身的接口,并将AttributeInheritance
属性设置为MulticastInheritance.Strict
。然后,该属性将被多播到实现该接口的类。此用例记录在Understanding Aspect Inheritance。
// In the UIAppearanceExtensibility project
[assembly: UI.Aspects.NullableMethodCallAspect(
AttributeInheritance = MulticastInheritance.Strict
AttributeTargetTypes = "UI.Appearance.Extensibility.Triage.*",
AttributeTargetMembers = "regex: handle*"
)]