我想将一个方面应用于程序集中返回类型为ActionResult的所有公共方法。
我在想:
[assembly: MyActionAspect(AttributeTargetMemberAttributes = MulticastAttributes.Public, AttributeTargetTypes = "ActionResult")]
但它似乎不起作用......
答案 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
。