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);
}