AttributeTargetElements = MulticastTargets.Method不被尊重吗? [英] AttributeTargetElements = MulticastTargets.Method isn't respected?

查看:69
本文介绍了AttributeTargetElements = MulticastTargets.Method不被尊重吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我应用了这一方面:

[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)

But if it doesn't respect the AttributeTargetElements setting: it enters WmiClassMethodAspect.OnEntry and WmiClassMethodAspect.OnExit for properties too (set_MyProperty and get_MyProperty, for instance)

推荐答案

之所以会发生这种情况,是因为 MulticastTargets.Method 将属性访问器视为方法(它们是方法).请注意, MulticastTarget.Property 用于指定属性(方法组),例如用于 LocationLevelAspect .

This happens because MulticastTargets.Method treats property accessors as methods (which they are). Note that MulticastTarget.Property specifies property (method group) for purposes of e.g. LocationLevelAspect.

要产生预期的行为,您需要基于属性的获取器和设置器的名称添加一个排除项:

To produce the intended behavior, you would need to add an exclusion for property getters and setters based their name:

[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)]

如果要在一个属性中使用此属性,则可以使用正则表达式:

If you want this in one attribute, you can use regular expressions:

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

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

This is probably the most succinct solution.

这篇关于AttributeTargetElements = MulticastTargets.Method不被尊重吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆