public Delegate Compile(string name, LambdaExpression expression)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            using (Timer.Step("MethodBuilderCompiler.Compile"))
            {
                expression.AssertNoPrivateMethods();

                var typeB = _module.DefineType(name, TypeAttributes.Public);

                var v = new AddFieldsForConstantsVisitor(typeB);
                expression = v.VisitAndConvert(expression, nameof(Compile));

                var methodB = typeB.DefineMethod(
                    MethodName,
                    MethodAttributes.Public | MethodAttributes.Static,
                    expression.ReturnType,
                    expression.Parameters.Select(p => p.Type).ToArray());

                expression.CompileToMethod(methodB);

                var type = typeB.CreateType();

                foreach (var f in v.Fields)
                {
                    var fi = type.GetField(f.Value.Name);
                    fi.SetValue(null, f.Key.Value);
                }

                var method = type.GetMethod(MethodName);
                var del    = Delegate.CreateDelegate(expression.Type, method);
                return(del);
            }
        }