我可以将方面应用于具有特定返回类型的程序集中的所有公共方法吗?

时间:2013-12-18 03:54:13

标签: aop postsharp

我想将一个方面应用于程序集中返回类型为ActionResult的所有公共方法。

我在想:

[assembly: MyActionAspect(AttributeTargetMemberAttributes = MulticastAttributes.Public, AttributeTargetTypes = "ActionResult")]

但它似乎不起作用......

1 个答案:

答案 0 :(得分:1)

在您的示例中,您设置了AttributeTargetTypes = "ActionResult",但AttributeTargetTypes与方法的返回类型无关。它允许您过滤应用方面的类型。因此,如果要在ActionResult类中应用方面(还可以使用通配符和正则表达式in this property),则可以将其设置为ActionResult类型的全名。

但是,要在返回类型上过滤方法,您需要采用不同的方法。

第一个选项是覆盖您方面的CompileTimeValidate,并为要过滤的方法返回false

public override bool CompileTimeValidate(MethodBase method)
{
    MethodInfo methodInfo = method as MethodInfo;
    return methodInfo != null && methodInfo.ReturnType == typeof (ActionResult);
}

第二个选项是创建另一个属性并实现IAspectProvider。这有点费力,但允许您动态地向代码添加方面并实现更复杂的方案。

[MulticastAttributeUsage(MulticastTargets.Method)]
public class MyAspectProvider : MulticastAttribute, IAspectProvider
{
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
    {
        MethodInfo methodInfo = (MethodInfo) targetElement;
        if (methodInfo.ReturnType == typeof (ActionResult))
        {
            return new[] {new AspectInstance(targetElement, new MyActionAspect())};
        }

        return new AspectInstance[0];
    }
}

// apply to assembly:
[assembly: MyAspectProvider(AttributeTargetMemberAttributes = MulticastAttributes.Public)]

您可以在this doc page上详细了解IAspectProvider