C#方法过滤器
方法过滤器
使用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#方法过滤器的更多相关文章
- 方法过滤器,分布式缓存 Memcached实现Session解决方案
控制器-〉方法过滤器-〉controller-> 方法 所以通过建立controller基类的方法进行方法过滤,所有控制器先执行基类的OnActionExecuting 方法. using Sp ...
- Springboot 三种拦截Rest API的方法-过滤器、拦截器、切片
过滤器方式实现拦截(Filter) 通过继承Servlet的Filter类来实现拦截: @Component public class TimeFilter implements Filter { @ ...
- Web API 方法的返回类型、格式器、过滤器
一.Action方法的返回类型 a) 操作方法的返回类型有四种:void.简单或复杂类型.HttpResponseMessage类型.IHttpActionResult类型. b) 如果返回类型为vo ...
- Servlet过滤器
Servlet过滤器 [TOC] 1.过滤器的基本概念 1.1.基本概念 过滤器(Filter)属于tomcat服务器中的Servlet功能.在普通的javaweb服务中,jsp中的请求要被Servl ...
- ASP.NET MVC过滤器
在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有.园子里关于过滤器的资料也有很多,这篇文章主要是记 ...
- Servlet过滤器Filter用法
1 Servlet 过滤器方法 过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类.javax.servlet.Filter 接口定义了三个方法:public void ...
- MVC - 16.MVC过滤器
filter n. 滤波器:[化工] 过滤器:筛选:滤光器 vt. 过滤:渗透:用过滤法除去 1.过滤器表 过滤器类型 接口 默认实现 描述 Action IActionFilte ...
- Asp.net MVC 之过滤器
整理一下MVC中的几种过滤器,以及每种过滤器是干什么用的 四种过滤器 1.AuthorizationFilter(授权过滤器) 2.ActionFilter(方法过滤器) 3.ResultFilter ...
- Servlet的过滤器Filter
Servlet 编写过滤器 Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Serv ...
随机推荐
- 【python】——sql模拟
一.作业需求: 当然此表你在文件存储时可以这样表示 1,Alex Li,22,13651054608,IT,2013-04-01 现需要对这个员工信息文件,实现增删改查操作 可进行模糊查询,语法至少支 ...
- NodeJS笔记(三)-创建第一个NodeJS web项目 Express
参考:Express的安装 先创建一个文件夹专门存放NodeJS项目,这里以“E:\NodeJSProject”为例 CMD指向该目录 执行以下命名 mkdir expressdemo cd expr ...
- python-颜色显示
格式:\033[显示方式;字体色;背景色m......[\033[0m] ------------------------------------------- 字体色 | 背景色 | 颜色描述 -- ...
- ES6 对象
对象字面量 属性的简洁表示法 ES6允许对象的属性直接写变量,这时候属性名是变量名,属性值是变量值. const age = 12; const name = "Amy"; con ...
- Linux是cat、tail、head查看文件任意几行的数据
Linux是cat.tail.head查看文件任意几行的数据 一.使用cat.tail.head组合 1.查看最后100行的数据 cat filename | tail -n 100 2.查看100到 ...
- .net 调用python 实例
如标题 ,python属于解释型语言,所以直接将python的文件copy到项目中 新建.net控制台应用程序,直接nuget IronPython 安装成功后 在项目内新建Sum文件夹,将py.p ...
- Java 基础 IO流(转换流,缓冲)
一,前言 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStr ...
- 深入理解Java虚拟机5-chap7-斗者2星
一.类加载机制 1.类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Class文件加载到内存,这就是类加载机制. 2.类型 ...
- 自增ID算法snowflake - C#版
急景流年,铜壶滴漏,时光缱绻如画,岁月如诗如歌.转载一篇博客来慰藉,易逝的韶华. 使用UUID或者GUID产生的ID没有规则 Snowflake算法是Twitter的工程师为实现递增而不重复的ID实现 ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃(一)
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...