public static Type GenerateClass(ClassDescription description)
        {
            var             name            = new AssemblyName("MyAssembly");
            AssemblyBuilder assemblyBuilder =
                Thread.GetDomain().DefineDynamicAssembly(
                    name, AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(
                name.Name, name.Name + ".dll");
            TypeBuilder typeBuilder = moduleBuilder.DefineType(
                description.TypeName, TypeAttributes.Class | TypeAttributes.Public);

            foreach (var constructorDescr in description.Constructors)
            {
                var staticOrDynamicAttr =
                    constructorDescr.StaticOrDynamic == StaticOrDynamic.Static ?
                    MethodAttributes.Static : MethodAttributes.Public;
                // второй вариант по сути ничего не добавляет, но атрибута Dynamic нет

                var inTypes = constructorDescr.InputTypes
                              .Select(typeName => description.AllTypes[typeName].RealType)
                              .ToArray();

                typeBuilder.DefineConstructor(
                    MethodAttributes.Public | staticOrDynamicAttr,
                    CallingConventions.Standard,
                    inTypes);
            }


            foreach (var methodDescr in description.Methods)
            {
                var staticOrDynamicAttr =
                    methodDescr.StaticOrDynamic == StaticOrDynamic.Static ?
                    MethodAttributes.Static : MethodAttributes.Public;

                var outType = description.AllTypes[methodDescr.OutputType].RealType;
                var inTypes = methodDescr.InputTypes
                              .Select(typeName => description.AllTypes[typeName].RealType)
                              .ToArray();

                var method = typeBuilder.DefineMethod(
                    methodDescr.MethodName,
                    MethodAttributes.Public | staticOrDynamicAttr,
                    outType,
                    inTypes);


                GroboIL iLgenerator = new GroboIL(method);
                iLgenerator.Newobj(new NotImplementedException()
                                   .GetType()
                                   .GetConstructors()[0]);
                iLgenerator.Throw();
            }

            var type = typeBuilder.CreateType();

            assemblyBuilder.Save(name.Name + ".dll");
            return(type);
        }
        static void DescribeSerializeSample()
        {
            ClassDescription item   = DescribeSomeClass();
            string           result = JsonConvert.SerializeObject(item, settings);

            result = MakeReadable(result);
            File.WriteAllText(resultFileName, result);
        }
        static void DeserializesGenerateSample()
        {
            DescribeSerializeSample();
            string           source = File.ReadAllText(resultFileName);
            ClassDescription res    = JsonConvert.DeserializeObject <ClassDescription>(source);

            Type type = Generator.GenerateClass(res);
        }
        static ClassDescription DescribeSomeClass()
        {
            ClassDescription descr = new ClassDescription("MyClass");

            descr.StatOrDyn = StaticOrDynamic.Dynamic;
            var m = new MethodDescription("Add");

            m.StaticOrDynamic = StaticOrDynamic.Dynamic;
            m.InputTypes      = new[] { "string", "int" };
            m.OutputType      = "string";
            descr.Methods.Add(m);
            return(descr);
        }