Beispiel #1
0
        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()));
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }