6

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

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

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

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

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

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

4

1 回答 1

6

这是解决方案:

  • 以所有方法为目标[MulticastAttributeUsage(MulticastTargets.Method)]
  • 覆盖CompileTimeValidate(MethodBase method)。设置返回值,以便在适当的目标上返回,CompileTimeValidate在要静默忽略的目标上返回,并在应提醒用户 Aspect 使用不适当时引发异常(这在PostSharp 文档中有详细说明)。truefalse

在代码中:

[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;
    }
}
于 2012-11-27T02:49:25.793 回答