using System.Reflection.Emit;
public static void Main()
var assembleBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("Dynamic"), AssemblyBuilderAccess.RunAndCollect);
var moduleBuilder = assembleBuilder.DefineDynamicModule("Dynamic.dll");
var typeA = moduleBuilder.DefineType("classA");
var defaultConstructorBuilder = typeA.DefineTypeInitializer();
var mpType = typeof(MessageParser<>).MakeGenericType(typeA);
var parserFieldBuilder = typeA.DefineField("Parser", mpType, FieldAttributes.Static | FieldAttributes.Private);
var methodInfo = typeof(Helper).GetMethod(nameof(Helper.GetDefaultMessageParser)).MakeGenericMethod(typeA);
var ctorGenerator = defaultConstructorBuilder.GetILGenerator();
ctorGenerator.Emit(OpCodes.Call, methodInfo);
ctorGenerator.Emit(OpCodes.Stsfld, parserFieldBuilder);
ctorGenerator.Emit(OpCodes.Ret);
var type = typeA.CreateType();
var instance = Activator.CreateInstance(type);
var value = type.GetField("Parser", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(new object[]{});
Console.WriteLine(value?.ToString());
public static MessageParser<T> GetDefaultMessageParser<T>()
where T : new() => new MessageParser<T>(() => new T());
public class MessageParser<T>
public MessageParser(Func<T> func)