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”属性上使用正则表达式(有关详细信息,请参见我的编辑)。