3
我看優秀的小巧玲瓏的微型ORM,並在Dapper.Rainbow項目,有一些代碼,創建一個表構造函數,使用IL。我希望這是什麼代碼做什麼有人可以給我解釋一下 - 顯然,這是動態的發光代碼來創建一個構造函數(或者是它的代碼來調用構造函數,或兩者),但什麼是真實而實際發射創建代碼,爲什麼這是需要的嗎?爲什麼小巧玲瓏的發光IL代碼在CreateTableConstructor?
下面的代碼
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>));
}
雖然我並不有助於幻燈克拉這似乎是建立一個構造中,它可以從數據庫模型直接設定模型的值。它只是生成鍋爐板代碼。 – 2013-04-10 13:41:50
感謝您的評論和編輯。那麼,什麼是C#相當於該IL代碼構造函數 - 而它這樣做是爲了救我不必這些構建函數添加到我的所有模型類? – 2013-04-10 13:52:15