方法过滤器

使用Emit和注解属性Attribute实现

使用方式

1. 自定义方法过滤器

可分别定义方法执行前过滤器, 方法执行结束过滤器, 方法异常过滤器

  • 执行前过滤器继承 ExecutingFilterAttribute 抽象类, 实现 Execute 抽象方法, 参数 parameters 为运行时拦截方法的参数列表

      /// <summary>
    /// 自定义执行前过滤器
    /// </summary>
    public class CustomExecutingFilterAttribute : ExecutingFilterAttribute
    {
    public string Name { get; set; } public override void Execute(MethodParameters[] parameters)
    {
    Console.WriteLine("=====================================================================");
    if (parameters != null)
    Console.WriteLine($"执行前过滤器:{nameof(CustomExecutingFilterAttribute)}, Data:{this.Name}, Param:{string.Join(", ", parameters?.Select(p => p.ToString()))}");
    else
    Console.WriteLine($"执行前过滤器:{nameof(CustomExecutingFilterAttribute)}, Data:{this.Name}");
    }
    }
  • 执行后过滤器继承 ExecutedFilterAttribute 抽象类, 实现 Execute 抽象方法,其中泛型参数 returned 为拦截方法返回值, 对于无返回值的方法(void),此参数默认为数字 0

      /// <summary>
    /// 自定义执行后过滤器
    /// </summary>
    public class CustomExecutedFilterAttribute : ExecutedFilterAttribute
    {
    public override void Execute<TReturn>(MethodParameters[] parameters, TReturn returned)
    {
    if (parameters != null)
    Console.WriteLine($"执行后过滤器:{nameof(CustomExecutedFilterAttribute)},Param:{string.Join(", ", parameters?.Select(p => p.ToString()))}, Return:{returned}");
    else
    Console.WriteLine($"执行后过滤器:{nameof(CustomExecutedFilterAttribute)},Return:{returned}");
    Console.WriteLine("=====================================================================\r\n");
    }
    }
  • 异常过滤器继承 ErrorFilterAttribute 抽象类, 实现 Execute 抽象方法, 其中参数 ex 为拦截方法抛出的未处理异常

      /// <summary>
    /// 自定义错误过滤器
    /// </summary>
    public class CustomErrorFilterAttribute : ErrorFilterAttribute
    {
    public override void Execute(MethodParameters[] parameters, Exception ex)
    {
    Console.ForegroundColor = ConsoleColor.Red;
    if (parameters != null)
    Console.WriteLine($"异常过滤器:{nameof(CustomErrorFilterAttribute)}, Param:{string.Join(", ", parameters?.Select(p => p.ToString()))},Exception:{ex}");
    else
    Console.WriteLine($"异常过滤器:{nameof(CustomErrorFilterAttribute)}, Exception:{ex}");
    Console.ResetColor();
    }
    }

2. 定义接口

    public interface IRepository
{
void Add<T>(T entity); void Remove<T>(T entity); void Update<T>(T entity, Func<T, bool> predicate);
}

3. 定义接口实现类, 并在拦截方法上运用自定义过滤器

public class Repository : IRepository
{
private List<string> list = new List<string>(); //运用过滤器
[CustomExecutingFilter]
[CustomExecutedFilter]
[CustomErrorFilter]
public void Add<T>(T entity)
{
list.Add(entity.ToString());
Console.WriteLine($"Added: Count-{list.Count}");
} //运用过滤器
[CustomExecutingFilter]
[CustomExecutedFilter]
[CustomErrorFilter]
public void Remove<T>(T entity)
{
list.Remove(entity.ToString());
Console.WriteLine($"Removed: Count-{list.Count}");
} //运用过滤器
[CustomExecutingFilter]
[CustomExecutedFilter]
[CustomErrorFilter]
public void Update<T>(T entity, Func<T, bool> predicate)
{
var item = list.FirstOrDefault(p => predicate(entity));
if (item == null)
throw new Exception("列表中不存在更新的项");
list.Remove(item);
list.Add(entity.ToString());
}
}

4. 调用

    //实例化接口实现类
var repo = new Repository();
//动态生成代理
var repoProxy = EmitGenerator<IRepository>.GenerateProxy(repo); //使用代理调用方法
repoProxy.Add("Hello");
repoProxy.Add("World");
repoProxy.Remove("World");
repoProxy.Update("A,ning", p => p == "World"); //将会抛出列表中不存在项异常

5. 运行结果

Github:https://github.com/waning1995/Filter

C#方法过滤器的更多相关文章

  1. 方法过滤器,分布式缓存 Memcached实现Session解决方案

    控制器-〉方法过滤器-〉controller-> 方法 所以通过建立controller基类的方法进行方法过滤,所有控制器先执行基类的OnActionExecuting 方法. using Sp ...

  2. Springboot 三种拦截Rest API的方法-过滤器、拦截器、切片

    过滤器方式实现拦截(Filter) 通过继承Servlet的Filter类来实现拦截: @Component public class TimeFilter implements Filter { @ ...

  3. Web API 方法的返回类型、格式器、过滤器

    一.Action方法的返回类型 a) 操作方法的返回类型有四种:void.简单或复杂类型.HttpResponseMessage类型.IHttpActionResult类型. b) 如果返回类型为vo ...

  4. Servlet过滤器

    Servlet过滤器 [TOC] 1.过滤器的基本概念 1.1.基本概念 过滤器(Filter)属于tomcat服务器中的Servlet功能.在普通的javaweb服务中,jsp中的请求要被Servl ...

  5. ASP.NET MVC过滤器

    在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有.园子里关于过滤器的资料也有很多,这篇文章主要是记 ...

  6. Servlet过滤器Filter用法

    1 Servlet 过滤器方法 过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类.javax.servlet.Filter 接口定义了三个方法:public void ...

  7. MVC - 16.MVC过滤器

          filter n. 滤波器:[化工] 过滤器:筛选:滤光器 vt. 过滤:渗透:用过滤法除去   1.过滤器表   过滤器类型 接口 默认实现 描述 Action IActionFilte ...

  8. Asp.net MVC 之过滤器

    整理一下MVC中的几种过滤器,以及每种过滤器是干什么用的 四种过滤器 1.AuthorizationFilter(授权过滤器) 2.ActionFilter(方法过滤器) 3.ResultFilter ...

  9. Servlet的过滤器Filter

    Servlet 编写过滤器 Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Serv ...

随机推荐

  1. Gym 101873C - Joyride - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://codeforces.com/gym/101873/problem/C 题意: 这是七月的又一个阳光灿烂的日子,你决定和你的小女儿一起度过快乐的一天.因为她真的很喜欢隔壁镇上的 ...

  2. Windows渗透利器之Pentest BOX使用详解(一)

    内容概览:                                     知识科普                                    优缺点总结 功能参数详解翻译: 控制 ...

  3. 把项目运行到本地环境及mysql配置

    1. 添加本地域名C:\Windows\System32\drivers\etc\hosts 127.0.0.1 local.v7.com 2. 添加一个apache虚拟站点D:\wamp64\bin ...

  4. BeanUtils工具类

    用对象传参,用JavaBean传参. BeanUtils可以优化传参过程. 学习框架之后,BeanUtils的功能都由框架来完成. 一.为什么用BeanUtils? 每次我们的函数都要传递很多参数很麻 ...

  5. python基础(3)-pycharm安装&for循环&format字符串&list列表&set集合使用

    安装IDE(PyCharm)&破解 点击下载安装包,安装. 点击下载破解补丁. 进入pycharm安装bin目录,将破解补丁copy到当前目录. 在bin目录下找到pycharm.exe.vm ...

  6. CMake和Linux编程:find_package的使用

    1.第一个CMake例子 在 t1 目录建立 main.c 和 CMakeLists.txt(注意文件名大小写): main.c 文件内容: //main.c #include <stdio.h ...

  7. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:建立一个EF数据模型

    英文渣水平,大伙凑合着看吧…… 这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第一篇: ...

  8. vue-amap | 基于 Vue 2.x 与高德的地图组件

    vue-amap | 基于 Vue 2.x 与高德的地图组件 参考:https://elemefe.github.io/vue-amap/#/

  9. phpcms内容页替换

    一.浏览次数替换 <script type="text/javascript" src="{JS_PATH}js/jquery-1.11.2.min.js" ...

  10. debug调试命令