我试图实现自己的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,它们有' Type'和'价值'属性。但是如何将其转换为il指令???
我唯一可以写的是:
il.InsertBefore(inst0, Instruction.Create(OpCodes.Newobj, attr.Constructor));
但是如何将参数传递给这个构造函数,就像声明它一样? 我需要一个与特定构造函数实现无关的通用选项。