C# AttributeTargetElements=多播目标;不受尊重?

C# AttributeTargetElements=多播目标;不受尊重?,c#,postsharp,aop,C#,Postsharp,Aop,我应用了这一方面: [Serializable] [MulticastAttributeUsage(MulticastTargets.Method)] // regular methods, excluding ctors! public class WmiClassMethodAspect : OnMethodBoundaryAspect { public WmiClassMethodAspect() { ApplyToStateMachine = false; } // PostSh

我应用了这一方面:

[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.onetry
WmiClassMethodAspect.OnExit
set_MyProperty
get_MyProperty

之所以发生这种情况,是因为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,并将方面显式提供给您想要的方法。不过,另一个选择是在“positive”属性上使用正则表达式(有关详细信息,请参见我的编辑)。