我有一个WebAPI应用程序,我在其中实现了一个异常处理操作过滤器,该过滤器派生自ExceptionFilterAttribute,我在Action级别应用它。简化版:
public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
Action cleanUp;
public override void OnException(HttpActionExecutedContext context)
{
// ...
if (cleanUp != null)
{
cleanUp();
}
}
}
// On Action
[ExceptionHandlingAttribute(cleanUp = () => { // do something.. })]
public SomeModel Foo(SomeModel input) {}
我希望一个动作能够在Action Filter中传递一个要执行的函数(Func或Action)(如上面的cleanUp)。有没有办法实现这个目标?
答案 0 :(得分:1)
不,遗憾的是,您将无法使用属性执行此操作。传递给属性的参数只允许是以下任何一种,从C#规范中提取:
属性类的位置和命名参数的类型 仅限于属性参数类型,它们是:
以下类型之一:bool,byte,char,double,float,int, 长,短,串。
类型对象。
类型System.Type。
枚举类型,前提是它具有公共可访问性和类型 嵌套的(如果有的话)也具有公共可访问性(Section 17.2)。
上述类型的一维数组。
请参阅https://msdn.microsoft.com/en-us/library/aa664615%28v=vs.71%29.aspx
作为后续,您还有其他选择。例如,您可以将类型的类型传递给清理函数,以及将函数的名称作为字符串常量传递给它。然后,您将有足够的信息使用反射来实例化类型并根据需要调用该方法。
以下是一个例子:
public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
private readonly Type _type;
private readonly string _method;
public ExceptionHandlingAttribute(Type type, string method){ _type = type; _method = method; }
public override void OnException(HttpActionExecutedContext context)
{
var instance = Activator.CreateInstance(_type);
var method = _type.GetMethod(_method);
var result = method.Invoke(instance);
//process result
}
}