なぜDapperはCreateTableConstructorでILコードを発行していますか?

.net c# dapper il

質問

私は優れたDapperマイクロオームを見ています.Dapper.Rainbowプロジェクトには、ILを使用してテーブルctorを作成するコードがいくつかあります。私は誰かがこのコードが何をしているのかを私に説明してくれることを望んでいました。明らかに、コンストラクタを作成するコードを動的に出しています(あるいはコンストラクタを呼び出すコードですか?これが必要ですか?

ここにコードがあります

protected Action<TDatabase> CreateTableConstructor(Type tableType)
{
    var dm = new DynamicMethod("ConstructInstances", null, new Type[] { typeof(TDatabase) }, true);
    var il = dm.GetILGenerator();

    var setters = GetType().GetProperties()
        .Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == tableType)
        .Select(p => Tuple.Create(
                p.GetSetMethod(true),
                p.PropertyType.GetConstructor(new Type[] { typeof(TDatabase), typeof(string) }),
                p.Name,
                p.DeclaringType
         ));

    foreach (var setter in setters)
    {
        il.Emit(OpCodes.Ldarg_0);
        // [db]

        il.Emit(OpCodes.Ldstr, setter.Item3);
        // [db, likelyname]

        il.Emit(OpCodes.Newobj, setter.Item2);
        // [table]

        var table = il.DeclareLocal(setter.Item2.DeclaringType);
        il.Emit(OpCodes.Stloc, table);
        // []

        il.Emit(OpCodes.Ldarg_0);
        // [db]

        il.Emit(OpCodes.Castclass, setter.Item4);
        // [db cast to container]

        il.Emit(OpCodes.Ldloc, table);
        // [db cast to container, table]

        il.Emit(OpCodes.Callvirt, setter.Item1);
        // []
    }

    il.Emit(OpCodes.Ret);
    return (Action<TDatabase>)dm.CreateDelegate(typeof(Action<TDatabase>));
}

受け入れられた回答

基本的には、次のような( Database<T>から派生した)現在の型のすべてのプロパティをとります。

public Table<SomeEntity> SomeTable { get; private set; }

そのようなプロパティごとに次のようなコードを実行するデリゲートを作成します。

var table = new Table<SomeEntity>(db, "SomeTable");
db.SomeTable = table;


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow