0

独自の aop フレームワーク (PostSharp など) を実装しようとしています。そして、1つの問題に行き詰まりました。

属性があるとしましょう:

[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 には、'Type' プロパティと 'Value' プロパティを持つ CustomAttributes.Constructor (MethodReference) と CustomAttributes.ConstructorArguments があります。しかし、それをil命令に変換する方法は???

私が書くことができる唯一のことは次のとおりです。

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

しかし、宣言されたとおりに、このコンストラクターに引数を渡すにはどうすればよいでしょうか? 特定のコンストラクターの実装に結び付けられていない汎用オプションが必要です。

4

0 に答える 0