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);
}
}
在某些namespace
类别上:
[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.
要产生预期的行为,您需要基于属性的获取器和设置器的名称添加一个排除项:
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屋!