gpt4 book ai didi

c# - 仅将方面应用于具有特定属性的方法

转载 作者:太空狗 更新时间:2023-10-29 21:34:53 24 4
gpt4 key购买 nike

我正在尝试设置一个 PostSharp 方面 RunOutOfProcessAttribute 以便它适用于:

  1. 所有公共(public)方法
  2. 任何标有 DoSpecialFunctionAttribute 的方法,无论成员可访问性如何(公共(public)/ protected /私有(private)/其他)。

到目前为止,我的 RunOutOfProcessAttribute 是这样定义的:

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Public)]
[AttributeUsage(AttributeTargets.Class)]
public class RunOutOfProcessAttribute : MethodInterceptionAspect
{
public override void OnInvoke(MethodInterceptionArgs args)
{
...
}
}

已经存在的 MulticastAttributeUsageAttribute 应该满足上面的标准 1,但我不知道如何满足标准 2,而不是简单地将现有方面的行为复制到新属性中。

无论成员可访问性(公共(public)/ protected /私有(private)/其他)如何,我如何才能将此方面应用于任何标有 DoSpecialFunctionAttribute 的方法?

最佳答案

解决方法如下:

  • 使用 [MulticastAttributeUsage(MulticastTargets.Method)] 定位所有方法
  • 重写 CompileTimeValidate(MethodBase 方法)。设置返回值,使 CompileTimeValidate 在适当的目标上返回 true,在目标上返回 false 以静默忽略,并在用户应该抛出异常时抛出异常请注意 Aspect 使用不当(这在 PostSharp documentation 中有详细说明)。

在代码中:

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method)]
[AttributeUsage(AttributeTargets.Class)]
public class RunOutOfProcessAttribute : MethodInterceptionAspect
{
protected static bool IsOutOfProcess;

public override void OnInvoke(MethodInterceptionArgs args)
{
...
}

public override bool CompileTimeValidate(MethodBase method)
{
if (method.DeclaringType.GetInterface("IDisposable") == null)
throw new InvalidAnnotationException("Class must implement IDisposable " + method.DeclaringType);

if (!method.Attributes.HasFlag(MethodAttributes.Public) && //if method is not public
!MethodMarkedWith(method,typeof(InitializerAttribute))) //method is not initialiser
return false; //silently ignore.

return true;
}
}

关于c# - 仅将方面应用于具有特定属性的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13558892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com