0

我正在尝试实现我自己的 aop 框架(如 PostSharp)。并且遇到了一个问题。

说有一个属性:

[AttributeUsage(AttributeTargets.Method)]
public class LogAttribute : Attribute
{
    public LogAttribute(int level, Type type)
    {
        // init fields...
    }
    public virtual void OnEnter(LogEventArg e)
    {
        // do some stuff...
    }
}

这适用于其中一种方法:

[Log(3, typeof(Trace))]
static void TestMethod1(string s)
{
     // do some stuff...
}

现在的问题是:如何将其转换为:

static void TestMethod1(string s)
{
     var t = new LogAttribute(3, typeof(Trace));
     t.OnEnter()
     // do some stuff...
}

我想从方法中剥离属性而不是使用这样的东西:

var m = System.Reflection.MethodBase.GetCurrentMethod();
var attr = (LogAttribute) Attribute.GetCustomAttribute(m, typeof(Log));

使用 Mono.Cecil 我有 CustomAttributes.Constructor (MethodReference) 和 CustomAttributes.ConstructorArguments,它们具有“类型”和“值”属性。但是如何将其转换为 il 指令???

我唯一能写的是:

il.InsertBefore(inst0, Instruction.Create(OpCodes.Newobj, attr.Constructor));

但是如何将参数传递给这个构造函数,就像它被声明的那样?我需要一个不依赖于特定构造函数实现的通用选项。

4

0 回答 0