我正在尝试实现我自己的 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));
但是如何将参数传递给这个构造函数,就像它被声明的那样?我需要一个不依赖于特定构造函数实现的通用选项。