将方法传递给WebAPI中的ExceptionFilterAttribute

时间:2016-01-15 04:15:57

标签: c# asp.net-web-api

我有一个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)。有没有办法实现这个目标?

1 个答案:

答案 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
    }
}