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

查看:15
本文介绍了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);
    }
}

在某些命名空间的类上:

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

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

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天全站免登陆