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