private void GenerateMethod(TypeBuilder type, MethodMetadata methodMetadata) { if(type == null) throw new ArgumentNullException("type"); if(methodMetadata == null) throw new ArgumentNullException("methodMetadata"); var attrs = MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig; var callingConvenction = CallingConventions.HasThis; var parameters = methodMetadata.Parameters.Select(x => x.Type).ToArray(); var method = type.DefineMethod(methodMetadata.Name, attrs, callingConvenction, methodMetadata.ReturnType, parameters); var il = method.GetILGenerator(); var g = new DynamicILGenerator(il); foreach(var parameter in methodMetadata.Parameters) method.DefineParameter(parameter.Position, ParameterAttributes.None, parameter.Name); foreach(var local in methodMetadata.Block.Locals) g.DeclareLocal(local); foreach(var line in methodMetadata.Block.Lines) this.GenerateLine(g, line); }