private static string GenerateClassFromJsonArray(string arr) { using (var ms = new MemoryStream()) { using (var tw = new StreamWriter(ms)) { var hash = Math.Abs(arr.GetHashCode()); var mrj = new ModelRuntime(); mrj.ClassName = "Data" + hash; var gen = new JsonClassGenerator(); gen.Example = arr; gen.InternalVisibility = false; gen.CodeWriter = new CSharpCodeWriter(); gen.ExplicitDeserialization = false; gen.Namespace = null; gen.NoHelperClass = true; gen.SecondaryNamespace = null; gen.TargetFolder = null; gen.UseProperties = true; gen.MainClass = mrj.ClassName; gen.UsePascalCase = false; gen.UseNestedClasses = true; gen.ApplyObfuscationAttributes = false; gen.SingleFile = true; gen.ExamplesInDocumentation = false; gen.OutputStream = tw; gen.GenerateClasses(); } return(Encoding.ASCII.GetString(ms.ToArray())); } }
private static Type GenerateTypeFromJson(string json) { var hash = Math.Abs(json.GetHashCode()); var mrj = new ModelRuntime(); mrj.ClassName = "Data" + hash; try { var typeExisting = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes()) .FirstOrDefault(t => t.FullName.Equals(mrj.ClassName)); if (typeExisting != null) { return(typeExisting); } } catch (Exception ex) { string s = ex.Message; } var code = GenerateClassFromJsonArray(json); var provider = new CSharpCodeProvider(); var parameters = new CompilerParameters(); parameters.ReferencedAssemblies.Add("System.dll"); //parameters.ReferencedAssemblies.Add("Newtonsoft.Json.dll"); // True - memory generation, false - external file generation parameters.GenerateInMemory = false; // True - exe file generation, false - dll file generation parameters.GenerateExecutable = false; var results = provider.CompileAssemblyFromSource(parameters, code); if (results.Errors.HasErrors) { var sb = new StringBuilder(); foreach (CompilerError error in results.Errors) { sb.AppendLine(string.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText)); } throw new InvalidOperationException(sb.ToString()); } var assembly = results.CompiledAssembly; var type = assembly.DefinedTypes.First(t => t.Name == mrj.ClassName); return(type); }
private static Type GenerateTypeFromProperties(string[] props) { var constructor = string.Join(",string ", props); var hash = Math.Abs(constructor.GetHashCode()); var mrj = new ModelRuntime(); mrj.ClassName = "Data" + hash; try { var typeExisting = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes()) .FirstOrDefault(t => t.FullName.Equals(mrj.ClassName)); if (typeExisting != null) { return(typeExisting); } } catch (Exception ex) { string s = ex.Message; } mrj.Properties = props; var template = @" using System; public class @Model.ClassName { //constructor public @Model.ClassName ( @foreach(var prop in Model.Properties){ <text>string @prop , </text> } //add a fake property string fake=null) { @foreach(var prop in Model.Properties){ <text>this.@prop = @prop;</text> } }//end constructor //properties @foreach(var prop in Model.Properties){ <text>public string @prop{get;set;}</text> } }//end class "; var code = Engine.Razor.RunCompile(template, mrj.ClassName, typeof(ModelRuntime), mrj); var provider = new CSharpCodeProvider(); var parameters = new CompilerParameters(); parameters.ReferencedAssemblies.Add("System.dll"); // True - memory generation, false - external file generation parameters.GenerateInMemory = false; // True - exe file generation, false - dll file generation parameters.GenerateExecutable = false; var results = provider.CompileAssemblyFromSource(parameters, code); if (results.Errors.HasErrors) { var sb = new StringBuilder(); foreach (CompilerError error in results.Errors) { sb.AppendLine(string.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText)); } throw new InvalidOperationException(sb.ToString()); } var assembly = results.CompiledAssembly; var type = assembly.DefinedTypes.First(t => t.Name == mrj.ClassName); return(type); }