예제 #1
0
        public void GenericObjectCreate()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples")
            .AddClass(Define.Class("TestClass").Generic("T")
                      .AddFields(
                          Define.Field(MemberAttributes.Private, "T", "_s")
                          )
                      .AddProperty("T", MemberAttributes.Public, "S", "_s")
                      ).AddClass(Define.Class("cls")
                                 .AddMethod(MemberAttributes.Public | MemberAttributes.Static, CodeDom.TypeRef("TestClass", "T"), () => "foo",
                                            Emit.declare(CodeDom.TypeRef("TestClass", "T"), "cc",
                                                         () => CodeDom.@new(CodeDom.TypeRef("TestClass", "T"))),
                                            Emit.@return((Var cc) => cc))
                                 .Generic("T")
                                 );

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp));

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB));

            var ass = c.Compile();

            Assert.IsNotNull(ass);

            Type TestClass = ass.GetType("Samples.TestClass`1");

            Assert.IsNotNull(TestClass);
        }
예제 #2
0
        public void WorkingWithEvent()
        {
            var c = new CodeDomGenerator();

            c.AddReference("System.Core.dll").AddNamespace("Samples").AddClass("cls")
            .AddEvent(typeof(Action), MemberAttributes.Public, "ev")
            .AddMethod(MemberAttributes.Public, () => "raise",
                       Emit.declare("cls2", "cc", () => CodeDom.@new("cls2")),
                       Emit.attachDelegate(CodeDom.@this, "ev", CodeDom.VarRef("cc"), "zoo"),
                       Emit.attachDelegate(CodeDom.@this, "ev", "cls2.foo"),
                       Emit.stmt(() => [email protected]("ev")()),
                       Emit.detachDelegate(CodeDom.@this, "ev", CodeDom.VarRef("cc"), "zoo")
                       )
            .AddClass("cls2")
            .AddMethod(MemberAttributes.Public, () => "zoo",
                       Emit.stmt(() => Console.WriteLine("ok"))
                       )
            .AddMethod(MemberAttributes.Public | MemberAttributes.Static, () => "foo",
                       Emit.stmt(() => Console.WriteLine("ok"))
                       )
            ;

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp));

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB));

            var ass = c.Compile();

            Assert.IsNotNull(ass);

            Type cls = ass.GetType("Samples.cls");

            Assert.IsNotNull(cls);
        }
예제 #3
0
        public void Builder_AccessProperty()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass("cls1")
            .AddField(typeof(int), "_i", () => 10)
            .AddProperty(typeof(int), MemberAttributes.Public, "I", "_i")
            .AddClass("cls2")
            .AddMethod(MemberAttributes.Public | MemberAttributes.Static, typeof(int), () => "foo",
                       Emit.declare("cls1", "cc", () => CodeDom.@new("cls1")),
                       Emit.@return((Var cc) => cc.Property <int>("I")))
            ;

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp));

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB));

            var ass = c.Compile();

            Assert.IsNotNull(ass);

            Type TestClass = ass.GetType("Samples.cls2");

            Assert.IsNotNull(TestClass);

            int s = (int)TestClass.InvokeMember("foo",
                                                BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod,
                                                null, null, null);

            Assert.AreEqual(10, s);
        }
예제 #4
0
        public void ObjectCreate()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("TestClass")
                                               .AddFields(
                                                   Define.Field(MemberAttributes.Private, typeof(string), "_s"),
                                                   Define.Field(MemberAttributes.Private, typeof(int), "_i")
                                                   )
                                               .AddCtor(
                                                   Define.Ctor((int i, string s) => MemberAttributes.Public,
                                                               Emit.assignField("_s", (string s) => s),
                                                               Emit.assignField("_i", (int i) => i)
                                                               )
                                                   )
                                               .AddMethod(MemberAttributes.Static | MemberAttributes.Public, "TestClass", () => "Create", Emit.@return(() => CodeDom.@new("TestClass", 100, "yyy")))
                                               );

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp));

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB));

            var ass = c.Compile();

            Assert.IsNotNull(ass);

            Type TestClass = ass.GetType("Samples.TestClass");

            Assert.IsNotNull(TestClass);
        }
예제 #5
0
        private CodeCompileUnit GenerateModificationTracker(WXMLModel model, WXMLCodeDomGeneratorSettings setting)
        {
            var c = new CodeDomGenerator();

            string mtName = "LinqModificationTracker";

            var cls = c.AddNamespace(model.Namespace).AddClass(mtName);

            _ctxName = model.Namespace + "." + model.LinqSettings.ContextName;
            _mtName  = model.Namespace + "." + mtName;

            string conn = ConfigurationManager.ConnectionStrings["wms"].ConnectionString;

            cls.Implements(typeof(IModificationTracker))
            .AddEnum("ActionEnum")
            .AddFields(
                Define.StructField("Update"),
                Define.StructField("Insert"),
                Define.StructField("Delete")
                );

            cls.AddField("_changed", () => new List <object>());
            cls.AddField("_deleted", () => new List <object>());

            var tableType = new CodeTypeReference(typeof(System.Data.Linq.Table <>));

            tableType.TypeArguments.Add(new CodeTypeReference("T"));

            cls
            .AddMethod(MemberAttributes.Public | MemberAttributes.Final, (ParamArray <object> entities) => "Add",
                       Emit.stmt((List <object> _changed, object[] entities) => _changed.AddRange(entities)))
            .Implements(typeof(IModificationTracker))
            .AddMethod(MemberAttributes.Public | MemberAttributes.Final, (ParamArray <object> entities) => "Delete",
                       Emit.stmt((List <object> _deleted, object[] entities) => _deleted.AddRange(entities)))
            .Implements(typeof(IModificationTracker))
            .AddMethod(MemberAttributes.Public | MemberAttributes.Final, () => "AcceptModifications",
                       Emit.@using(new CodeTypeReference(_ctxName), "ctx", () => CodeDom.@new(_ctxName, conn),
                                   Emit.@foreach("entity", () => [email protected] <IEnumerable <object> >("_changed"),
                                                 Emit.stmt((object entity) => [email protected]("SyncEntity")(CodeDom.VarRef("ctx"), entity, false))
                                                 ),
                                   Emit.@foreach("entity", () => [email protected] <IEnumerable <object> >("_deleted"),
                                                 Emit.stmt((object entity) => [email protected]("SyncEntity")(CodeDom.VarRef("ctx"), entity, true))
                                                 ),
                                   Emit.stmt(() => CodeDom.VarRef("ctx").Call("SubmitChanges")),
                                   Emit.@foreach("entity", () => [email protected] <IEnumerable <object> >("_changed"),
                                                 Emit.stmt((object entity) => [email protected]("AcceptChanges")(entity))
                                                 ),
                                   Emit.stmt(() => [email protected] <List <object> >("_changed").Clear()),
                                   Emit.@foreach("entity", () => [email protected] <IEnumerable <object> >("_deleted"),
                                                 Emit.stmt((object entity) => [email protected]("AcceptChanges")(entity))
                                                 ),
                                   Emit.stmt(() => [email protected] <List <object> >("_deleted").Clear())
                                   )
                       ).Implements(typeof(IModificationTracker))
            .AddMethod(MemberAttributes.Private, () => "Dispose").Implements(typeof(IDisposable))
            .AddMethod(MemberAttributes.Private, (object entity) => "AcceptChanges",
                       Emit.declare("mi", (object entity) => entity.GetType().GetMethod("AcceptChanges")),
                       Emit.@if(() => CodeDom.VarRef("mi") != null,
                                Emit.stmt((MethodInfo mi, object entity) => mi.Invoke(entity, null))
                                )
                       )
            .AddMethod(MemberAttributes.Private, (DynType ctx, object entity, bool delete) => "SyncEntity" + ctx.SetType(_ctxName),
                       Emit.@foreach("mi", () => [email protected] <Type>("GetType")().GetMethods(BindingFlags.NonPublic | BindingFlags.Static),
                                     Emit.@if((bool delete, MethodInfo mi, object entity) =>
                                              ((delete && mi.Name == "_DelEntity") || (!delete && mi.Name == "_SyncEntity")) && mi.GetParameters().Count() == 2 && mi.GetParameters().Last().ParameterType == entity.GetType(),
                                              Emit.stmt((MethodInfo mi, object entity) => mi.Invoke(null, BindingFlags.Static, null, new object[] { CodeDom.VarRef("ctx"), entity }, null)),
                                              Emit.exitFor()
                                              )
                                     )
                       )
            .AddMethod(MemberAttributes.Private | MemberAttributes.Static, (DynType p, DynType action, DynType table) => "SyncEntity" + p.SetType("T") + action.SetType("ActionEnum") + table.SetType(tableType),
                       Emit.ifelse(() => CodeDom.VarRef("action") == CodeDom.Field(new CodeTypeReference("ActionEnum"), "Insert"),
                                   CodeDom.CombineStmts(Emit.stmt(() => CodeDom.VarRef("table").Call("InsertOnSubmit")(CodeDom.VarRef("p")))),
                                   Emit.ifelse(() => CodeDom.VarRef("action") == CodeDom.Field(new CodeTypeReference("ActionEnum"), "Delete"),
                                               CodeDom.CombineStmts(
                                                   Emit.stmt(() => CodeDom.VarRef("table").Call("Attach")(CodeDom.VarRef("p"))),
                                                   Emit.stmt(() => CodeDom.VarRef("table").Call("DeleteOnSubmit")(CodeDom.VarRef("p")))
                                                   ),
                                               Emit.stmt(() => CodeDom.VarRef("table").Call("Attach")(CodeDom.VarRef("p"), true))
                                               )
                                   )
                       ).Generic("T", typeof(object))
            ;

            WXMLCodeDomGeneratorNameHelper n = new WXMLCodeDomGeneratorNameHelper(setting);

            foreach (var entity in model.GetActiveEntities())
            {
                if (entity.GetPkProperties().Count() == 1)
                {
                    //string entityName = entity.Name;
                    string entityProp = WXMLCodeDomGeneratorNameHelper.GetMultipleForm(entity.Name);
                    string entityType = n.GetEntityClassName(entity, true);
                    string pkName     = entity.GetPkProperties().Single().Name;

                    cls.AddMethod(MemberAttributes.Static | MemberAttributes.Private,
                                  (DynType ctx, DynType p) => "_DelEntity" + ctx.SetType(_ctxName) + p.SetType(entityType),
                                  Emit.stmt(() => CodeDom.Call(null, "SyncEntity", new CodeTypeReference(entityType))(
                                                CodeDom.VarRef("p"),
                                                CodeDom.Field(new CodeTypeReference("ActionEnum"), "Delete"),
                                                CodeDom.VarRef("ctx").Property(entityProp))
                                            )
                                  )
                    .AddMethod(MemberAttributes.Static | MemberAttributes.Private,
                               (DynType ctx, DynType p) => "_SynEntity" + ctx.SetType(_ctxName) + p.SetType(entityType),
                               Emit.stmt(() => CodeDom.Call(null, "SyncEntity", new CodeTypeReference(entityType))(
                                             CodeDom.VarRef("p"),
                                             CodeDom.VarRef("p").Field <int>(pkName) == 0 ? CodeDom.Field(new CodeTypeReference("ActionEnum"), "Insert") : CodeDom.Field(new CodeTypeReference("ActionEnum"), "Update"),
                                             CodeDom.VarRef("ctx").Property(entityProp))
                                         )
                               )
                    ;
                }
            }

            string debug = c.GenerateCode(CodeDomGenerator.Language.CSharp);

            return(c.GetCompileUnit(CodeDomGenerator.Language.CSharp));
        }
예제 #6
0
        public void Builder_MethodCall()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("TestClass")
                                               .AddMethod(MemberAttributes.Public, typeof(int), (int a) => "Test", Emit.@return((int a) => a + 100))
                                               .AddMethod(
                                                   Define.Method(MemberAttributes.Public, typeof(int), (int a) => "Test1", Emit.@return(() =>
                                                                                                                                        CodeDom.VarRef <int>("a") +
                                                                                                                                        [email protected] <int>("Test")(3)))
                                                   )
                                               ).AddClass(Define.Class("cls")
                                                          .AddMethod(MemberAttributes.Public | MemberAttributes.Static, () => "foo",
                                                                     Emit.declare("TestClass", "cc"),
                                                                     Emit.stmt(() => CodeDom.Call(CodeDom.VarRef("cc"), "Test1")(3))
                                                                     )
                                                          .AddMethod(MemberAttributes.Public | MemberAttributes.Static, () => "foo2",
                                                                     Emit.declare("TestClass", "cc", () => CodeDom.@new("TestClass")),
                                                                     Emit.stmt((Var cc) => cc.Call("Test1")(3))
                                                                     )
                                                          .AddMethod(MemberAttributes.Public | MemberAttributes.Static, (int s) => "foo3",
                                                                     Emit.declare("TestClass", "cc"),
                                                                     Emit.declare(typeof(int), "i"),
                                                                     Emit.stmt((int s) => CodeDom.Call(CodeDom.VarRef("cc"), "Test1")(CodeDom.VarRef <int>("i") + s))
                                                                     )
                                                          .AddMethod(MemberAttributes.Public, () => "foo4",
                                                                     Emit.@foreach("mi", () => [email protected] <Type>("GetType")().GetMethods(BindingFlags.NonPublic | BindingFlags.Static),
                                                                                   Emit.stmt(() => CodeDom.VarRef("mi").Call("GetParameters")),
                                                                                   Emit.@if((MethodInfo mi) => mi.Name == "dfdfd",
                                                                                            Emit.@return()
                                                                                            ),
                                                                                   Emit.@return()
                                                                                   )
                                                                     )
                                                          );

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp));

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB));

            var ass = c.Compile();

            Assert.IsNotNull(ass);

            Type TestClass = ass.GetType("Samples.TestClass");

            Assert.IsNotNull(TestClass);

            object t = TestClass.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null, null);

            Assert.IsNotNull(t);

            Assert.AreEqual(104, TestClass.InvokeMember("Test", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod, null, t,
                                                        new object[] { 4 }));

            Assert.AreEqual(104, TestClass.InvokeMember("Test1", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod, null, t,
                                                        new object[] { 1 }));
        }
예제 #7
0
        public void Builder_Ctors()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("TestClass")
                                               .AddFields(
                                                   Define.Field(MemberAttributes.Private, typeof(string), "_s"),
                                                   Define.Field(MemberAttributes.Private, typeof(int), "_i")
                                                   )
                                               .AddCtor(
                                                   Define.Ctor(() => MemberAttributes.Public,
                                                               Emit.assignField("_s", () => "xxx"),
                                                               Emit.assignField("_i", () => 10)
                                                               )
                                                   )
                                               .AddCtor(
                                                   Define.Ctor((int i, string s) => MemberAttributes.Public,
                                                               Emit.assignField("_s", (string s) => s),
                                                               Emit.assignField("_i", (int i) => i)
                                                               )
                                                   )
                                               .AddGetProperty(typeof(string), MemberAttributes.Public, "S", "_s").Comment("This is a comment")
                                               .AddGetProperty(typeof(int), MemberAttributes.Public, "I", "_i").Document("This is a documentation")
                                               .AddMethod(MemberAttributes.Static | MemberAttributes.Public, "TestClass", () => "Create",
                                                          Emit.@return(() => CodeDom.@new("TestClass", 100, "yyy")))
                                               );

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp));

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB));

            var ass = c.Compile();

            Assert.IsNotNull(ass);

            Type TestClass = ass.GetType("Samples.TestClass");

            Assert.IsNotNull(TestClass);

            object t = TestClass.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null, null);

            Assert.IsNotNull(t);

            Assert.AreEqual("xxx", TestClass.InvokeMember("S", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty, null, t, null));
            Assert.AreEqual(10, TestClass.InvokeMember("I", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty, null, t, null));

            t = TestClass.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null,
                                       new object[] { 100, "yyy" });

            Assert.IsNotNull(t);

            Assert.AreEqual("yyy", TestClass.InvokeMember("S", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty, null, t, null));
            Assert.AreEqual(100, TestClass.InvokeMember("I", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty, null, t, null));

            t = TestClass.InvokeMember("Create", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod, null, null, null);

            Assert.IsNotNull(t);

            Assert.AreEqual("yyy", TestClass.InvokeMember("S", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty, null, t, null));
            Assert.AreEqual(100, TestClass.InvokeMember("I", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty, null, t, null));
        }
예제 #8
0
        public void Builder_GenericMethod()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("TestClass").Generic("T")
                                               .AddFields(
                                                   Define.Field(MemberAttributes.Private, "T", "_s")
                                                   )
                                               .AddProperty("T", MemberAttributes.Public, "S", "_s")
                                               ).AddClass(Define.Class("cls")
                                                          .AddMethod(MemberAttributes.Public | MemberAttributes.Static, CodeDom.TypeRef(new CodeTypeReference("TestClass"), new CodeTypeReference("T")), () => "foo",
                                                                     Emit.declare(CodeDom.TypeRef(new CodeTypeReference("TestClass"), new CodeTypeReference("T")), "cc",
                                                                                  () => CodeDom.@new(CodeDom.TypeRef(new CodeTypeReference("TestClass"), new CodeTypeReference("T")))),
                                                                     Emit.@return((Var cc) => cc))
                                                          .Generic("T")
                                                          .AddMethod(MemberAttributes.Public | MemberAttributes.Static, () => "foo2",
                                                                     Emit.stmt(() => CodeDom.Call(CodeDom.TypeRef(new CodeTypeReference("cls")), "foo", typeof(int)))
                                                                     )
                                                          .AddMethod(MemberAttributes.Static, () => "foo3",
                                                                     Emit.@return()
                                                                     ).Generic("T", true, typeof(object))
                                                          .AddMethod(MemberAttributes.Static, () => "foo5",
                                                                     Emit.@return()
                                                                     ).Generic("T", true, "System.Object")
                                                          .AddMethod(MemberAttributes.Static, () => "foo6",
                                                                     Emit.@return()
                                                                     ).Generic("T", true, new CodeTypeReference(typeof(object)))
                                                          .AddMethod(MemberAttributes.Static, () => "foo4",
                                                                     Emit.@return()
                                                                     ).Generic("T", typeof(ValueType))
                                                          .AddMethod(MemberAttributes.Static, () => "foo7",
                                                                     Emit.@return()
                                                                     ).Generic("T", new CodeTypeReference(typeof(ValueType)))
                                                          .AddMethod(MemberAttributes.Static, () => "foo8",
                                                                     Emit.@return()
                                                                     ).Generic("T", "cls")
                                                          );

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp));

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB));

            var ass = c.Compile();

            Assert.IsNotNull(ass);

            Type TestClass = ass.GetType("Samples.TestClass`1");

            Assert.IsNotNull(TestClass);

            Type realType = TestClass.MakeGenericType(new Type[] { typeof(string) });

            Assert.IsNotNull(realType);

            Type clsType = ass.GetType("Samples.cls");

            Assert.IsNotNull(clsType);

            System.Reflection.MethodInfo mi = clsType.GetMethod("foo");

            Assert.IsNotNull(mi);

            System.Reflection.MethodInfo rmi = mi.MakeGenericMethod(typeof(string));

            object t = rmi.Invoke(null, null);

            Assert.IsNotNull(t);
        }
예제 #9
0
        public void TestUsing()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass("cls")
            .AddMethod(MemberAttributes.Static | MemberAttributes.Public, (System.IO.MemoryStream ms) => "foo",
                       Emit.@using((System.IO.MemoryStream ms) => ms,
                                   Emit.stmt(() => Console.WriteLine("using"))
                                   )
                       )
            .AddMethod(MemberAttributes.Static | MemberAttributes.Public, () => "zoo",
                       Emit.@using("ms", () => new System.IO.MemoryStream(),
                                   Emit.stmt(() => Console.WriteLine("using"))
                                   )
                       )
            .AddMethod(MemberAttributes.Static | MemberAttributes.Public, () => "zoo2",
                       Emit.@using(new CodeTypeReference(typeof(System.IO.MemoryStream)), "ms2", () => CodeDom.@new(typeof(System.IO.MemoryStream)),
                                   Emit.stmt(() => Console.WriteLine("using"))
                                   )
                       )
            ;

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp));

            Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB));

            var ass = c.Compile();

            Assert.IsNotNull(ass);

            Type TestClass = ass.GetType("Samples.cls");

            Assert.IsNotNull(TestClass);
        }