运行时代码生成:用 IL Emit 构建无反射的对象映射器
利用 System.Reflection.Emit 在运行时生成高效的 IL 代码,实现远快于反射的属性赋值/取值,打造轻量级 ORM 或序列化器。 · 难度:入门 · +10XP
运行时代码生成
反射虽灵活但性能差。本教程将通过 ILGenerator 动态创建委托,实现属性 getter/setter 的直接调用,避免 MethodInfo.Invoke。将展示如何为任意类型生成 Func
public static Func<object, object?> CreateGetter(PropertyInfo prop)
{
var method = new DynamicMethod("Get_" + prop.Name, typeof(object), new[] { typeof(object) }, true);
var il = method.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Callvirt, prop.GetMethod);
if (prop.PropertyType.IsValueType) il.Emit(OpCodes.Box, prop.PropertyType);
il.Emit(OpCodes.Ret);
return (Func<object, object?>)method.CreateDelegate(typeof(Func<object, object?>));
}