目  录

C# 使用Emit实现动态AOP框架 (一)

C# 使用Emit实现动态AOP框架 (二)

C# 使用Emit实现动态AOP框架 (三)

C# 使用Emit实现动态AOP框架 进阶篇之异常处理

C# 使用Emit实现动态AOP框架 进阶篇之优化

实现DynamicProxy前,先介绍几个必要的辅助类:

一、切面上下文类AspectContext

该类是作为切面特性类的OnEntry和OnEixt方法的参数用的,该类包含了被代理对象Sender、当前切入的方法名称(Name)、调用方法的参数列表(Args)以及返回值(Result)

  public class AspectContext
{ #region 构造函数
/// <summary>
/// 构造函数
/// </summary>
/// <param name="sender">被切入的对象</param>
/// <param name="name">切入方法名称</param>
/// <param name="args">调用参数</param>
public AspectContext(object sender, string name, object[] args)
{
Sender = sender; Name = name; Args = args; Result = null;
}
#endregion #region 属性 /// <summary>
/// 被切入的对象
/// </summary>
public object Sender { get; set; } /// <summary>
///切入方法名称
/// </summary>
public string Name { get; set; } /// <summary>
/// 方法调用参数
/// </summary>
public object[] Args { get; set; } /// <summary>
/// 返回值
/// </summary>
public object Result { get; set; } #endregion
}

二、切面特性基类 AspectAttribute

  /// <summary>
/// 切面特性基类
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property)]
public abstract class AspectAttribute : Attribute
{
public AspectAttribute()
{
IntercepType = XAOP.IntercepType.All;
} public abstract InterceptType InterceptType { get; set; } public abstract void OnEntry(AspectContext context); public abstract void OnExit(AspectContext context);
}

该类作为所有切面特性的基类,包含拦截的类型、方法调用入口和方法调用出口。

三、拦截类型 InterceptType

  /// <summary>
/// 拦截类型
/// </summary>
public enum InterceptType
{
#region 枚举值 /// <summary>
/// 入口
/// </summary>
OnEntry = , /// <summary>
/// 出口
/// </summary>
OnExit = , /// <summary>
/// 所有
/// </summary>
All = #endregion
}

四、日志特性类

该类简单实现了方法调用前后的日志记录功能。

    /// <summary>
/// 日志特性
/// </summary>
public class LogAttribute : AspectAttribute
{
public override InterceptType InterceptType { get; set; } #region 开始调用
/// <summary>
/// 开始调用
/// </summary>
/// <param name="context"></param>
public override void OnEntry(AspectContext context)
{
Console.Write("Log OnEntry:"); if (context != null && context.Args != null)
Console.WriteLine("{0}({1})", context.Name, string.Join(",", context.Args));
}
#endregion #region 调用结束
/// <summary>
///
/// </summary>
/// <param name="context"></param>
public override void OnExit(AspectContext context)
{
Console.WriteLine("Log OnExit: " + context.Name + (context.Result != null ? " Result: " + context.Result.ToString() : "") + "\r\n");
}
#endregion
}

C# 使用Emit实现动态AOP框架 (二)的更多相关文章

  1. C# 使用Emit实现动态AOP框架 (三)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  2. C# 使用Emit实现动态AOP框架 (一)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  3. C# 使用Emit实现动态AOP框架 进阶篇之异常处理

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  4. C# 使用Emit实现动态AOP框架 进阶篇之优化

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  5. C#利用Emit反射实现AOP,以及平台化框架封装思路

    C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...

  6. .NET 下基于动态代理的 AOP 框架实现揭秘

    .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihan ...

  7. Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架

    类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...

  8. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  9. Dora.Interception,为.NET Core度身打造的AOP框架:全新的版本

    Dora.Interception 1.0(Github地址:可以访问GitHub地址:https://github.com/jiangjinnan/Dora)推出有一段时间了,最近花了点时间将它升级 ...

随机推荐

  1. python中文显示乱码,已经在开头有了coding: utf-8

    乱码原因:因为你的文件声明为 utf-8,并且也应该是用 utf-8 的编码保存的源文件.但是 windows 的本地默认编码是 cp936,也就是 gbk 编码,所以在控制台直接打印 utf-8 的 ...

  2. Firefox Chrome Http请求插件

    Firefox:HttpRequester Chrome:Advanced Rest Client

  3. 16 Flutter仿京东商城项目 跳转到搜索页面实现搜索功能 以及搜索筛选

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  4. Qt编写安防视频监控系统10-视频轮询

    一.前言 视频轮询在视频监控系统中是一个基础的核心功能,尤其是上了大屏以后,这个功能是必须的,根据预先设定的轮询间隔逐个加载视频到预先设定的通道画面数中,轮询间隔.轮询画面数.轮询采用的码流类型(主码 ...

  5. Linux 文件操作相关常用命令

    1.创建文件夹 [root@izwz9148jq0xmzrb36r113z 20190726]# mkdir aaa //创建aaa文件夹 2.创建文件 [root@izwz9148jq0xmzrb3 ...

  6. CCIE总结:路由器、交换机

    bbs.spoto.net/forum--.html -----雏鹰部落 GNS3安装 .安装的所有目录不能使用中文 ISO如何操作 securecrt如何使用建立会话:之前总是连不上的原因是没有选 ...

  7. Jmeter 逻辑控制器 之 Include Controller

    一.认识 Include Controller Include Controller :译为包含控制器,用来添加 Test Fragment(测试片段).具体是什么意思呢,我们先来了解下 Test F ...

  8. Java中get()方法和set()方法如何使用?

    在java中,为了保证数据的安全性,我们会把数据定义为private等(私有.封装),如果想要调用就会用到set()方法与get方法或者构造函数方法.这里说的是第一种方法,set()与get(),既然 ...

  9. VC 学习笔记 (持续更新)

    基于windows的程序和基于MS-DOS的程序之间的一个最根本的差别,就在于MS-DOS程序是通过操作系统的功能来获得用户的输入的,而windows程序则是通过操作系统 发送的消息来处理用户输入的. ...

  10. 【ARM-Linux开发】内核3.x版本之后设备树机制

    内核3.x版本之后设备树机制 Based  on  Linux  3.10.24  source  code  参考/documentation/devicetree/Booting-without- ...