将一个方面应用于其他程序集类方法调用

时间:2015-11-26 16:24:08

标签: c# postsharp

我创造了一个简单的方面:

[Serializable()]
public class NullableCallAspect : PostSharp.Aspects.OnMethodBoundaryAspect
{
    public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args)
    {
        if (args.Instance == null)
            args.FlowBehavior = PostSharp.Aspects.FlowBehavior.Return;
    }
}

基本上,我希望instance.method调用instance == null调用它不会在方法中输入。我搞清楚,我需要改变方面的继承。所以,我需要将OnMethodBoundaryAspect改为另一个。这将是第一个问题。

另一个问题是如何将此方面应用于继承另一个程序集的接口的类的方法调用。

我已经尝试过了,但它并没有起作用:

[assembly: UI.Aspects.NullableCallAspect(
    AttributeTargetAssemblies = "UIAppearanceExtensibility",
    AttributeTargetTypes = "UI.Appearance.Extensibility.*.I*AppearanceManager",
    AttributeTargetMembers = "handle*"
)]

1 个答案:

答案 0 :(得分:1)

这种方面需要PostSharp不支持的呼叫站点拦截。 OnMethodBoundaryAspect和MethodInterceptionAspect都修改目标方法而不是调用站点本身 - 调用这些方面修饰的方法时仍然需要实例。

编辑: 有一个hack如何强制PostSharp拦截呼叫站点。当一个方面被多播到不同组件中的类型时。如果所有方法都在项目 ClassLibrary1 中实现,并且只是从 MyApplication 项目调用它们,则可以在 MyApplication 项目中对该方面进行多播: / p>

[assembly:
    NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*",
        AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)]

如果存在 IAppearanceManager 结尾的所有实现都具有带后缀 AppearanceManager 的名称的约定,则需要更改多播:

[assembly:
    NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*AppearanceManager",
        AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)]

如果没有这样的约定,则可以使用IAspectProvider进行多播。

当在同一个程序集中调用由 NullableCallAspect 修饰的方法时,这是不可用的 - 在这种情况下不会拦截调用站点。