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