【问题标题】:AttributeTargetElements = MulticastTargets.Method isn't respected?AttributeTargetElements = MulticastTargets.Method 不受尊重?
【发布时间】:2015-03-12 20:02:33
【问题描述】:

我应用了这个方面:

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method)] // regular methods, excluding ctors!
public class WmiClassMethodAspect : OnMethodBoundaryAspect
{
    public WmiClassMethodAspect() { ApplyToStateMachine = false; } // PostSharp Express edition...

    public override void OnEntry(MethodExecutionArgs args)
    {
        //base.OnEntry(args);
    }

    public override void OnExit(MethodExecutionArgs args)
    {
        //base.OnExit(args);
    }
}

在某些namespace的班级:

[assembly: WmiClassMethodAspect(AttributeTargetTypes = "OperatingSystemsWmi.*", 
    AttributePriority = 10, ApplyToStateMachine = false, 
    AttributeTargetElements = MulticastTargets.Method)]

但如果它不遵守AttributeTargetElements 设置:它也会输入WmiClassMethodAspect.OnEntryWmiClassMethodAspect.OnExit 作为属性(例如set_MyPropertyget_MyProperty

【问题讨论】:

    标签: c# postsharp aop


    【解决方案1】:

    发生这种情况是因为 MulticastTargets.Method 将属性访问器视为方法(它们就是)。请注意,MulticastTarget.Property 指定属性(方法组)的目的是为了例如LocationLevelAspect.

    要产生预期的行为,您需要根据其名称为属性 getter 和 setter 添加排除项:

    [assembly: WmiClassMethodAspect(AttributeTargetTypes = "OperatingSystemsWmi.*", 
               AttributePriority = 10, AttributeTargetElements = MulticastTargets.Method, 
               AttributeTargetMembers = "get_*", AttributeExclude = true)]
    
    [assembly: WmiClassMethodAspect(AttributeTargetTypes = "OperatingSystemsWmi.*", 
               AttributePriority = 10, ApplyToStateMachine = false, AttributeTargetElements = MulticastTargets.Method, 
               AttributeTargetMembers = "set_*", AttributeExclude = true)]
    

    编辑: 如果你想在一个属性中使用这个,你可以使用正则表达式:

    [assembly: WmiClassMethodAspect(AttributeTargetTypes = "OperatingSystemsWmi.*", 
               AttributePriority = 10, ApplyToStateMachine = false, 
               AttributeTargetElements = MulticastTargets.Method,
               AttributeTargetMembers = "regex:^(?!get_|set_).+")]
    

    这可能是最简洁的解决方案了。

    【讨论】:

    • 我可以在方面本身设置此排除吗?
    • 不,您需要使用例如IAspectProvider 和 AssemblyLevelAspect 并显式地为您想要的方法提供方面。不过,其他选项是在“积极”属性上使用正则表达式(有关详细信息,请参阅我的编辑)。
    猜你喜欢
    • 2020-02-21
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多