public static Func<object, object> CreateGetFieldMethod(FieldInfo fieldInfo)
{
DynamicMethod dynamicMethod = new DynamicMethod(
string.Concat("_GetF", fieldInfo.Name, "_"),
typeof(object),
new Type[] { typeof(object) },
fieldInfo.DeclaringType);
ILGenerator generator = dynamicMethod.GetILGenerator();
generator.Emit(OpCodes.Ldarg_0); // push object onto the stack
generator.Emit(OpCodes.Ldfld, fieldInfo); // .field
if (fieldInfo.FieldType.IsValueType)
{
generator.Emit(OpCodes.Box, fieldInfo.FieldType); //boxing is required for value types...
}
generator.Emit(OpCodes.Ret); // return
return (Func<object, object>)dynamicMethod.CreateDelegate(typeof(Func<object, object>));
}