1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public static Func<T1, T2> GetM<T1, T2>() where T2 : T1
{
var baseType = typeof(T1);
var derivedType = typeof(T2);
var dynamicMethod = new DynamicMethod(string.Empty, derivedType, new Type[] { baseType }, baseType, true);
var ilGenerator = dynamicMethod.GetILGenerator();
ilGenerator.DeclareLocal(derivedType);
ilGenerator.Emit(OpCodes.Newobj, derivedType.GetConstructor(Type.EmptyTypes));
ilGenerator.Emit(OpCodes.Stloc_0);
foreach (var prop in baseType.GetFields(BindingFlags.Instance | BindingFlags.Public))
{
ilGenerator.Emit(OpCodes.Ldloc_0);
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldfld, prop);
ilGenerator.Emit(OpCodes.Stfld, prop);
}
ilGenerator.Emit(OpCodes.Ldloc_0);
ilGenerator.Emit(OpCodes.Ret);
return dynamicMethod.CreateDelegate(typeof(Func<T1, T2>)) as Func<T1, T2>;
} |
Partager