using System.Collections.Generic;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
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 ignoresAccessChecksTo = new CustomAttributeBuilder
typeof(IgnoresAccessChecksToAttribute).GetConstructor(new Type[] { typeof(string) }),
new object[] { typeof(List<>).Assembly.GetName().Name }
assemblyBuilder.SetCustomAttribute(ignoresAccessChecksTo);
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>()));
namespace System.Runtime.CompilerServices
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public class IgnoresAccessChecksToAttribute : Attribute
public IgnoresAccessChecksToAttribute(string assemblyName)
=> AssemblyName = assemblyName;
public string AssemblyName { get; }