AttributeTargetElements = MulticastTargets.Method 不被尊重? [英] AttributeTargetElements = MulticastTargets.Method isn't respected?
问题描述
我应用了这个方面:
[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.OnEntry
和 WmiClassMethodAspect.OnExit
(set_MyProperty
和 get_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屋!