using System.Collections.Generic;
using System.Reflection.Emit;
public static void Main()
var method1 = new DynamicMethod("GetUnderlyingArray", typeof(int[]), new[] { typeof(List<int>) }, typeof(List<int>), true);
var ilGenerator1 = method1.GetILGenerator();
ilGenerator1.Emit(OpCodes.Ldarg_0);
ilGenerator1.Emit(OpCodes.Ldfld, typeof(List<int>).GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance));
ilGenerator1.Emit(OpCodes.Ret);
var arrayGetter1 = (Func<List<int>, int[]>)method1.CreateDelegate(typeof(Func<List<int>, int[]>));
Console.WriteLine("Example 1");
Console.WriteLine(arrayGetter1.Invoke(new List<int>()));
var assemblyName = new AssemblyName("Example");
var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var dynamicModule = assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll");
var type = dynamicModule.DefineType("GetUnderlyingArrayClass");
var method2 = type.DefineMethod("GetUnderlyingArray", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Static, typeof(int[]), new[] { typeof(List<int>) });
var ilGenerator2 = method2.GetILGenerator();
ilGenerator2.Emit(OpCodes.Ldarg_0);
ilGenerator2.Emit(OpCodes.Ldfld, typeof(List<int>).GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance));
ilGenerator2.Emit(OpCodes.Ret);
var arrayGetter2 = (Func<List<int>, int[]>)type.GetMethod("GetUnderlyingArray").CreateDelegate(typeof(Func<List<int>, int[]>));
Console.WriteLine("Example 2");
Console.WriteLine(arrayGetter2.Invoke(new List<int>()));