I hope this helps.
This is complete code example which produces runtime defined type with single static recursive method.
For the simplicity of the example the recursive method is infinite - at the end of the Main method the recursive method is called
static void Main(string[] args) { var moduleBuilder = CreateDynamicModuleBuilder(); var typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public | TypeAttributes.Class); var methodBuilder = typeBuilder.DefineMethod("SayHello", MethodAttributes.Static | MethodAttributes.Public); var methodExpression = CreateRecursiveExpression(); var lambda = Expression.Lambda(methodExpression); lambda.CompileToMethod(methodBuilder); var typeInfo = typeBuilder.CreateType(); var methodInfo = typeInfo.GetMethod("SayHello", BindingFlags.Public | BindingFlags.Static); methodInfo.Invoke(null, null); } private static Expression CreateRecursiveExpression() { var methodInfo = typeof(Console).GetMethod("WriteLine", new[] { typeof(String) }); var arg = Expression.Constant("Hello"); var consoleCall = Expression.Call(methodInfo, arg); var sayHelloActionVariable = Expression.Variable(typeof(Action), "sayHelloAction"); var block = Expression.Block( new[] { sayHelloActionVariable }, Expression.Assign( sayHelloActionVariable, Expression.Lambda( Expression.Block( consoleCall, Expression.Invoke(sayHelloActionVariable) ) ) ), Expression.Invoke(sayHelloActionVariable) ); return block; } private static ModuleBuilder CreateDynamicModuleBuilder() { var name = new AssemblyName("Example.DynamicRecursion"); var am = AssemblyBuilder.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave); var mb = am.DefineDynamicModule(name.Name, $"{name.Name}.dll"); return mb; }
This code will create type with the following signature
public class Person { public static void SayHello() { Action sayHelloAction; sayHelloAction = () => { Console.WriteLine("Hello"); sayHelloAction(); } sayHelloAction(); } }