postharp中的方面多播

时间:2015-11-27 08:56:32

标签: c# postsharp

我有一个简单的方面:

[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();
    }

}

我的解决方案中有两个项目:UIUIAppearanceExtensibility(由UI引用)。

在第二个中,我声明了一些接口,以便其他开发人员使用它们根据这些接口创建多个实现。

UI开始,我声明了这些接口的属性,例如IInterface1

所以,从我的UI项目(程序集)开始,我需要将我的方面应用于每次调用IInterface1个对象......

我试过了,但是,它不起作用:

[assembly: UI.Aspects.NullableMethodCallAspect(
    AttributeTargetAssemblies = "UIAppearanceExtensibility",
    AttributeTargetTypes = "UI.Appearance.Extensibility.Triage.*",
    AttributeTargetMembers = "regex: handle*"
)]

1 个答案:

答案 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*"
)]