C#实现动态aop比较麻烦,需要用到IL中间语言的知识,笔者最近也在研究,在这记录和分享一下核心方法的解读,本人才疏学浅,如果错误还请指出
/// <summary>
/// 创建动态代理方法
/// </summary>
/// <param name="typeBuilder">类型构造器</param>
/// <param name="method">方法元数据</param>
/// <param name="realObjectField">实际对象</param>
/// <param name="aspectFields">切面</param>
private static void EmitMethod(TypeBuilder typeBuilder, MethodInfo method, FieldBuilder realObjectField, List<AspectField> aspectFields)
{
//参数列表
var parameters = method.GetParameters();
//动态实例
var emitter = Sigil.NonGeneric.Emit.BuildInstanceMethod(method.ReturnType, parameters.Select(i => i.ParameterType).ToArray(), typeBuilder, method.Name, MethodAttributes.Public | MethodAttributes.Virtual);
//label base
var lbCallBase = emitter.DefineLabel();
//label return
var lbReturn = emitter.DefineLabel();
//方法上下文
var methodContextLocal = emitter.DeclareLocal(typeof(MethodContext));
//返回
var returnLocal = method.ReturnType != typeof(void) ? emitter.DeclareLocal(method.ReturnType) : null;
//本地存储
var objArrayLocal = emitter.DeclareLocal(typeof(object[]));
//异常
var exceptionLocal = emitter.DeclareLocal<Exception>();
//切面列表
var aspects = method.GetCustomAttributes(typeof(AspectAtt