方法过滤器

使用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. 【python】——sql模拟

    一.作业需求: 当然此表你在文件存储时可以这样表示 1,Alex Li,22,13651054608,IT,2013-04-01 现需要对这个员工信息文件,实现增删改查操作 可进行模糊查询,语法至少支 ...

  2. NodeJS笔记(三)-创建第一个NodeJS web项目 Express

    参考:Express的安装 先创建一个文件夹专门存放NodeJS项目,这里以“E:\NodeJSProject”为例 CMD指向该目录 执行以下命名 mkdir expressdemo cd expr ...

  3. python-颜色显示

    格式:\033[显示方式;字体色;背景色m......[\033[0m] ------------------------------------------- 字体色 | 背景色 | 颜色描述 -- ...

  4. ES6 对象

    对象字面量 属性的简洁表示法 ES6允许对象的属性直接写变量,这时候属性名是变量名,属性值是变量值. const age = 12; const name = "Amy"; con ...

  5. Linux是cat、tail、head查看文件任意几行的数据

    Linux是cat.tail.head查看文件任意几行的数据 一.使用cat.tail.head组合 1.查看最后100行的数据 cat filename | tail -n 100 2.查看100到 ...

  6. .net 调用python 实例

    如标题 ,python属于解释型语言,所以直接将python的文件copy到项目中 新建.net控制台应用程序,直接nuget  IronPython 安装成功后 在项目内新建Sum文件夹,将py.p ...

  7. Java 基础 IO流(转换流,缓冲)

    一,前言 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStr ...

  8. 深入理解Java虚拟机5-chap7-斗者2星

    一.类加载机制 1.类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Class文件加载到内存,这就是类加载机制. 2.类型 ...

  9. 自增ID算法snowflake - C#版

    急景流年,铜壶滴漏,时光缱绻如画,岁月如诗如歌.转载一篇博客来慰藉,易逝的韶华. 使用UUID或者GUID产生的ID没有规则 Snowflake算法是Twitter的工程师为实现递增而不重复的ID实现 ...

  10. Android -- 带你从源码角度领悟Dagger2入门到放弃(一)

    1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...