Ejemplo n.º 1
0
        public void TestGoTo()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass("cls")
            .AddMethod(MemberAttributes.Static | MemberAttributes.Public, typeof(int), () => "foo",
                       Emit.declare(typeof(int), "i"),
                       Emit.@goto("x"),
                       Emit.assignVar("i", () => 10),
                       Emit.label("x"),
                       Emit.@return((int i) => 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.cls");

            Assert.IsNotNull(TestClass);

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

            Assert.IsNotNull(t);

            Assert.AreEqual(0, TestClass.InvokeMember("foo", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod, null, t, null));
        }
Ejemplo n.º 2
0
        public void TestPropertyInterface()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples")
            .AddClass(Define.Class("ee", TypeAttributes.Public, true).Implements(new CodeTypeReference("Ixxx"))
                      .AddMember(Define.Property(new CodeTypeReference(typeof(string)), MemberAttributes.Public,
                                                 "prop",
                                                 new CodeStatement[] { Emit.@return(() => "sdfsf") },
                                                 new CodeStatement[] { Emit.assignVar("value", () => "sadfaf") }
                                                 ).Implements(new CodeTypeReference("Ixxx"), "dsf"))
                      ).AddInterface(Define.Interface("Ixxx")
                                     .AddProperty(new CodeTypeReference(typeof(string)), MemberAttributes.Public, "dsf")
                                     );

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

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

            var ass = c.Compile(null, CodeDomGenerator.Language.VB);

            Assert.IsNotNull(ass);

            Type eeClass = ass.GetType("Samples.ee");

            Assert.IsNotNull(eeClass);

            ass = c.Compile(null, CodeDomGenerator.Language.CSharp);

            Assert.IsNotNull(ass);
        }
Ejemplo n.º 3
0
        private void GenerateCS()
        {
            using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
            {
                CodeGeneratorOptions     opts      = new CodeGeneratorOptions();
                StringWriter             sw        = new StringWriter();
                List <CodeTypeReference> implTypes = new List <CodeTypeReference>();
                if (_property.ImplementationTypes != null)
                {
                    var arr = new CodeTypeReference[_property.ImplementationTypes.Count];
                    _property.ImplementationTypes.CopyTo(arr, 0);
                    _property.ImplementationTypes.Clear();
                    _property.PrivateImplementationType = null;
                    implTypes.AddRange(arr);
                }
                provider.GenerateCodeFromMember(_property, sw, opts);
                foreach (CodeTypeReference tr in implTypes)
                {
                    _property.ImplementationTypes.Add(tr);
                }
                //StringReader sr = new StringReader(sw.GetStringBuilder().ToString());
                //string line = sr.ReadLine();
                //while (string.IsNullOrEmpty(line) || line.StartsWith("/") || line.StartsWith("["))
                //    line = sr.ReadLine();

                StringBuilder sb = new StringBuilder();

                if (InterfaceProperties != null)
                {
                    foreach (CodeTypeReference tr in implTypes)
                    {
                        string prop;
                        if (InterfaceProperties.TryGetValue(tr, out prop))
                        {
                            var newProp = Define.Property(_property.Type, MemberAttributes.Private, prop).Implements(tr);
                            if (_property.HasGet)
                            {
                                newProp.GetStatements.Add(Emit.@return(() => [email protected](_property.Name)));
                                newProp.HasGet = true;
                            }
                            if (_property.HasSet)
                            {
                                newProp.SetStatements.Add(Emit.assignProperty(_property.Name, () => CodeDom.VarRef("value")));
                                newProp.HasSet = true;
                            }

                            StringWriter swNew = new StringWriter();
                            provider.GenerateCodeFromMember(CodeDomTreeProcessor.ProcessMember(newProp, CodeDomGenerator.Language.CSharp),
                                                            swNew, opts);
                            sb.Append(swNew.ToString());
                        }
                    }
                    if (sb.Length > 0)
                    {
                        sb.Insert(0, Environment.NewLine);
                    }
                }
                Text = sw.GetStringBuilder().ToString() + sb.ToString();
            }
        }
Ejemplo n.º 4
0
        static void Main2()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass("cls")
            .AddMethod(MemberAttributes.Public | MemberAttributes.Static, typeof(string), (int i) => "Print",
                       Emit.@if((int i) => i < 10,
                                Emit.@return(() => "i less than 10")
                                ),
                       Emit.@return(() => "i greater than 10")
                       );

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

            var c2 = new CodeDomGenerator();

            CodeMemberMethod method = Define.Method(MemberAttributes.Public, () => "foo");

            c2.AddNamespace("TestNS").AddClass("Fibonacci")
            .AddMethod(MemberAttributes.Public | MemberAttributes.Static, (int x) => "Calc",
                       Emit.@if((int x) => x <= 1,
                                Emit.@return(() => 1)),
                       Emit.@return((int x) =>
                                    CodeDom.Call <int>("Calc")(x - 1) + CodeDom.Call <int>("Calc")(x - 2))
                       )
            ;

            Console.WriteLine(c2.GenerateCode(LinqToCodedom.CodeDomGenerator.Language.CSharp));

            Console.WriteLine(c2.GenerateCode(LinqToCodedom.CodeDomGenerator.Language.VB));
        }
Ejemplo n.º 5
0
        public void Builder_Loop()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("TestClass")
                                               .AddMethod(
                                                   Define.Method(MemberAttributes.Public | MemberAttributes.Static, typeof(int), (int a) => "Test",
                                                                 Emit.declare("res", () => 0),
                                                                 Emit.@for(
                                                                     "i",               //int i
                                                                     (int a) => a,      // = a
                                                                     (int i) => i < 10, //i<10
                                                                     (int i) => i + 1,  //i+=1
                                                                     Emit.assignVar("res", (int res) => res + 1)
                                                                     ), Emit.@return((int res) => res))
                                                   )
                                               .AddMethod(
                                                   Define.Method(MemberAttributes.Public | MemberAttributes.Static, typeof(int), (int a) => "Test1",
                                                                 Emit.declare("res", () => 0),
                                                                 Emit.@for("i", (int a) => a, (int i) => i < 10, () => CodeDom.VarRef <int>("i") + 2,
                                                                           Emit.assignVar("res", () => CodeDom.VarRef <int>("res") + 1)
                                                                           ), Emit.@return(() => CodeDom.VarRef <int>("res") + 100))
                                                   )
                                               );

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

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

            Assert.AreEqual(5, c.Compile().GetType("Samples.TestClass").GetMethod("Test")
                            .Invoke(null, new object[] { 5 }));

            Assert.AreEqual(103, c.Compile().GetType("Samples.TestClass").GetMethod("Test1")
                            .Invoke(null, new object[] { 5 }));
        }
Ejemplo n.º 6
0
        public void Builder_GetProperty()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("TestClass")
                                               .AddGetProperty(typeof(int), MemberAttributes.Public, "Test",
                                                               Emit.@return(() => 100)
                                                               )
                                               .AddMethod(MemberAttributes.Public, typeof(int), (int a) => "Test1", Emit.@return((int a) =>
                                                                                                                                 a + [email protected] <int>("Test")))
                                               );

            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("Test1", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod, null, t,
                                                        new object[] { 4 }));
        }
Ejemplo n.º 7
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);
        }
Ejemplo n.º 8
0
        public void TestDefaultProperty()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("ee", TypeAttributes.Public, true)
                                               .AddMember(Define.GetProperty(new CodeTypeReference(typeof(string)), MemberAttributes.Family,
                                                                             (int idx) => "prop", true,
                                                                             Emit.@return((int idx) => idx.ToString())
                                                                             ))
                                               .AddMember(Define.Property(new CodeTypeReference(typeof(string)), MemberAttributes.Family,
                                                                          (int idx) => "prop2", false,
                                                                          CodeDom.CombineStmts(Emit.@return((int idx) => idx.ToString())),
                                                                          Emit.declare("i", (int idx) => idx)
                                                                          ))
                                               );

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

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

            var ass = c.Compile(null, CodeDomGenerator.Language.VB);

            Assert.IsNotNull(ass);

            Type eeClass = ass.GetType("Samples.ee");

            Assert.IsNotNull(eeClass);
        }
Ejemplo n.º 9
0
        public void TestExceptionHandling()
        {
            //try catch
            //try finally
            //throw
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass("cls")
            .AddMethod(MemberAttributes.Public | MemberAttributes.Static, typeof(string), () => "foo",
                       Emit.trycatch(Emit.@throw(() => new ApplicationException()))
                       .AddCatch(typeof(ApplicationException), "ex",
                                 Emit.@return(() => "ok")
                                 )
                       .AddFinally(Emit.stmt(() => Console.WriteLine())))
            ;

            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);
        }
Ejemplo n.º 10
0
        public void Builder_Operator()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass("ee")
            .AddOperators(
                Define.Operator(new CodeTypeReference(typeof(int)),
                                (DynType t) => CodeDom.TypedSeq(OperatorType.Implicit, t.SetType("ee")),
                                Emit.@return(() => 10)
                                )
                )
            ;

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

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

            var ass = c.Compile();

            Assert.IsNotNull(ass);

            Type eeClass = ass.GetType("Samples.ee");

            Assert.IsNotNull(eeClass);
        }
Ejemplo n.º 11
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);
        }
Ejemplo n.º 12
0
        public void TestAnonymousMethod()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples")
            .AddClass("cls")
            .AddMethod(MemberAttributes.Public | MemberAttributes.Static, () => "foo",
                       Emit.declare("a", () => CodeDom.Lambda <Func <int, double> >(new [] { new LambdaParam("s") },
                                                                                    Emit.@return((double s) => s + 1)
                                                                                    ))
                       )
            ;

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

            c.AddReference("System.Core.dll");

            var ass = c.Compile();

            Assert.IsNotNull(ass);

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

            Assert.IsNotNull(TestClass);
        }
Ejemplo n.º 13
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 }));
        }
Ejemplo n.º 14
0
        public void Builder_Property()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("TestClass")
                                               .AddFields(
                                                   Define.Field(MemberAttributes.Private, typeof(string), "_s")
                                                   )
                                               .AddProperty(
                                                   Define.Property(typeof(string), MemberAttributes.Public, "Test",
                                                                   CodeDom.CombineStmts(Emit.@return(() => [email protected] <string>("_s"))),
                                                                   Emit.assignField("_s", (string value) => value)
                                                                   )
                                                   )
                                               .AddProperty(
                                                   Define.Property(typeof(string), MemberAttributes.Public, "Test2", "_s")
                                                   )
                                               .AddProperty(typeof(string), MemberAttributes.Public, "Test3", "_s")
                                               .AddProperty("TestClass", MemberAttributes.Public, "Test4",
                                                            CodeDom.CombineStmts(Emit.@return(() => CodeDom.@this)),
                                                            Emit.@throw(() => new NotImplementedException(
                                                                            CodeDom.Property <string>(CodeDom.VarRef("value"), "Test")
                                                                            ))
                                                            )
                                               .AddMethod(MemberAttributes.Public, typeof(string), (int a) => "Test1",
                                                          Emit.assignProperty("Test", () => Guid.NewGuid().ToString()),
                                                          Emit.@return((int a) =>
                                                                       a.ToString() + [email protected] <string>("Test")))
                                               );

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

            string s = TestClass.InvokeMember("Test1", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod, null, t,
                                              new object[] { 4 }) as string;

            Assert.IsNotNull(s);

            string TestProperty = s.Substring(1);

            Assert.AreEqual(TestProperty, TestClass.InvokeMember("Test", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty, null, t, null));
        }
Ejemplo n.º 15
0
        public void InstanceClassDelegate()
        {
            var c = new CodeDomGenerator();

            c.AddReference("System.Core.dll").AddNamespace("Samples").AddClass("cls")
            .AddMethod(MemberAttributes.Public, typeof(string), () => "foo", Emit.declare(typeof(Func <int, string>), "h2"), Emit.assignDelegate("h2", CodeDom.@this, "zoo"), Emit.@return((Func <int, string> h2) => h2(10)))
            .AddMethod(MemberAttributes.Public, typeof(string), (int i) => "zoo", Emit.@return((int i) => i.ToString()))
            .AddClass("cls2")
            .AddMethod(MemberAttributes.Public | MemberAttributes.Static, typeof(string), (DynType cc) => "foo" + cc.SetType("cls"), Emit.declare(typeof(Func <int, string>), "h2"), Emit.assignDelegate("h2", CodeDom.VarRef("cc"), "zoo"), Emit.@return((Func <int, string> h2) => h2(100)))
            .AddMethod(MemberAttributes.Public | MemberAttributes.Static, typeof(string), (DynType cc, DynType c2) => "foo" + cc.SetType("cls") + c2.SetType(typeof(string)), Emit.declare(typeof(Func <int, string>), "h2"), Emit.assignDelegate("h2", CodeDom.VarRef("cc"), "zoo"), Emit.@return((Func <int, string> h2, string c2) => h2(100) + c2))
            ;

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

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

            Assert.IsNotNull(t);

            string s = (string)cls.InvokeMember("foo",
                                                System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Instance,
                                                null, t, null);

            Assert.AreEqual("10", s);

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

            Assert.IsNotNull(cls2);

            object t2 = cls2.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null, null);

            Assert.IsNotNull(t2);

            string s2 = (string)cls2.InvokeMember("foo",
                                                  System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Static,
                                                  null, t2, new object[] { t });

            Assert.AreEqual("100", s2);
        }
        private void GetRelationMethods(string relationIdentifier, string propName)
        {
            if (Settings.UseTypeInProps)
            {
                string cln = new WXMLCodeDomGeneratorNameHelper(_settings).GetEntityClassName(_entity, false);
                //string dn = cln + ".Descriptor";

                Members.Add(Define.Method(MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static,
                                          typeof(RelationDescEx),
                                          (EntityUnion hostEntity) => "Get" + propName,
                                          Emit.@return((EntityUnion hostEntity) =>
                                                       new RelationDescEx(hostEntity, new M2MRelationDesc(
                                                                              new EntityUnion(CodeDom.TypeOf(cln)),
                                                                              relationIdentifier
                                                                              ))
                                                       )
                                          ));
            }
            else
            {
                //string cln = new WXMLCodeDomGeneratorNameHelper(_settings).GetEntityClassName(_entity, true);
                const string dn = "Descriptor";//cln + ".Descriptor";

                Members.Add(Define.Method(MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static,
                                          typeof(RelationDescEx),
                                          (EntityUnion hostEntity) => "Get" + propName,
                                          Emit.@return((EntityUnion hostEntity) =>
                                                       new RelationDescEx(hostEntity, new M2MRelationDesc(
                                                                              new EntityUnion(CodeDom.Field <string>(CodeDom.TypeRef_str(dn), "EntityName")),
                                                                              relationIdentifier
                                                                              ))
                                                       )
                                          ));
            }

            Members.Add(Define.Method(MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static,
                                      typeof(RelationDescEx),
                                      (EntityUnion hostEntity, EntityUnion joinEntity) => "Get" + propName,
                                      Emit.@return((EntityUnion hostEntity, EntityUnion joinEntity) =>
                                                   new RelationDescEx(hostEntity, new M2MRelationDesc(
                                                                          joinEntity,
                                                                          relationIdentifier
                                                                          ))
                                                   )
                                      ));
        }
        private void PopulateDontRaise()
        {
            if (_entity.GetPkProperties().Count() == 0)
            {
                return;
            }

            var prop = new CodeMemberProperty()
            {
                Attributes = MemberAttributes.Override | MemberAttributes.Public,
                Name       = "DontRaisePropertyChange",
                Type       = new CodeTypeReference(typeof(bool)),
                HasSet     = false,
                HasGet     = true
            };

            Members.Add(prop);

            prop.GetStatements.Add(
                Emit.@return(() => true)
                );
        }
Ejemplo n.º 18
0
        public void TypeOfExpression()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass("cls")
            .AddMethod(MemberAttributes.Static | MemberAttributes.Public, typeof(string), (object o) => "foo",
                       Emit.ifelse((object o) => o.GetType() == typeof(int),
                                   CodeDom.CombineStmts(Emit.@return(() => "int")),
                                   Emit.@return(() => "other")))
            ;

            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);
        }
Ejemplo n.º 19
0
        public void ThisTest()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples")
            .AddClass("cls").Implements(typeof(IServiceProvider))
            .AddMethod(MemberAttributes.Public, typeof(object), (Type t) => "GetService",
                       Emit.@return(() => [email protected] <IServiceProvider>())
                       ).Implements(typeof(IServiceProvider))
            ;

            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);
        }
Ejemplo n.º 20
0
        public void Builder_If()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("TestClass")
                                               .AddMethod(
                                                   Define.Method(MemberAttributes.Public | MemberAttributes.Static, typeof(int), (int a) => "Test",
                                                                 Emit.ifelse((int a) => a == 10,
                                                                             CodeDom.CombineStmts(Emit.@return(() => 1)),
                                                                             Emit.@return(() => - 1)
                                                                             ))
                                                   )
                                               .AddMethod(
                                                   Define.Method(MemberAttributes.Public | MemberAttributes.Static, typeof(int), (int a) => "Test2",
                                                                 Emit.ifelse((int a) => a < 10,
                                                                             CodeDom.CombineStmts(Emit.@return(() => 1)),
                                                                             Emit.@return(() => - 1)
                                                                             ))
                                                   )
                                               .AddMethod(
                                                   Define.Method(MemberAttributes.Public | MemberAttributes.Static, typeof(int), (int a) => "Test3",
                                                                 Emit.ifelse((int a) => a * 3 < 7,
                                                                             CodeDom.CombineStmts(Emit.@return(() => 1)),
                                                                             Emit.@return(() => - 1)
                                                                             ))
                                                   )
                                               .AddMethod(
                                                   Define.Method(MemberAttributes.Public | MemberAttributes.Static, typeof(int), (int a) => "Test4",
                                                                 Emit.ifelse((int a) => Math.Abs(a) * 3 < 7 + Math.Min(4, a),
                                                                             CodeDom.CombineStmts(Emit.@return(() => 1)),
                                                                             Emit.@return(() => - 1)
                                                                             ))
                                                   )
                                               );

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

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

            Assert.AreEqual(1, c.Compile().GetType("Samples.TestClass").GetMethod("Test")
                            .Invoke(null, new object[] { 10 }));

            Assert.AreEqual(-1, c.Compile().GetType("Samples.TestClass").GetMethod("Test")
                            .Invoke(null, new object[] { 100 }));

            Assert.AreEqual(1, c.Compile().GetType("Samples.TestClass").GetMethod("Test2")
                            .Invoke(null, new object[] { 7 }));

            Assert.AreEqual(-1, c.Compile().GetType("Samples.TestClass").GetMethod("Test2")
                            .Invoke(null, new object[] { 100 }));

            Assert.AreEqual(-1, c.Compile().GetType("Samples.TestClass").GetMethod("Test3")
                            .Invoke(null, new object[] { 10 }));

            Assert.AreEqual(1, c.Compile().GetType("Samples.TestClass").GetMethod("Test3")
                            .Invoke(null, new object[] { 2 }));

            Assert.AreEqual(1, c.Compile().GetType("Samples.TestClass").GetMethod("Test4")
                            .Invoke(null, new object[] { 2 }));

            Assert.AreEqual(-1, c.Compile().GetType("Samples.TestClass").GetMethod("Test4")
                            .Invoke(null, new object[] { -10 }));
        }
Ejemplo n.º 21
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);
        }
Ejemplo n.º 22
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));
        }
Ejemplo n.º 23
0
        public void InstanceDelegate()
        {
            var c = new CodeDomGenerator();

            c.AddReference("System.Core.dll").AddNamespace("Samples").AddClass("cls")
            .AddMethod(MemberAttributes.Static | MemberAttributes.Public, typeof(string), () => "foo", Emit.declare("h2", () => new Func <string>("aaa".ToString)), Emit.@return((Func <string> h2) => h2()))
            ;

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

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

            Assert.AreEqual("aaa", s);
        }
Ejemplo n.º 24
0
        public void Builder_Attribute()
        {
            var c = new CodeDomGenerator();

            c.AddNamespace("Samples").AddClass(Define.Class("TestClass")
                                               .AddAttribute(Define.Attribute(typeof(SerializableAttribute)))
                                               .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.Public | MemberAttributes.Static, typeof(object), (MemoryStream ms) => "Deserialize",
                                                          Emit.declare("f", () => new BinaryFormatter()),
                                                          Emit.stmt((MemoryStream ms) => ms.Seek(0, SeekOrigin.Begin)),
                                                          Emit.@return((BinaryFormatter f, MemoryStream ms) => f.Deserialize(ms))
                                                          )
                                               );

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

            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter f = new BinaryFormatter();

                f.Serialize(ms, t);

                //object t2 = TestClass.GetMethod("Deserialize").Invoke(null, new object[] { ms });

                //Assert.IsNotNull(t2);

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

                //Assert.AreEqual(
                //    TestClass.InvokeMember("I", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty, null, t, null),
                //    TestClass.InvokeMember("I", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty, null, t2, null)
                //);
            }
        }
Ejemplo n.º 25
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);
        }
        protected virtual void OnPupulateEntityRelations()
        {
            var relationDescType = new CodeTypeReference(typeof(RelationDescEx));

            foreach (var entityRelation in _entity.GetActiveOne2ManyRelations())
            {
                string accessorName = string.IsNullOrEmpty(entityRelation.AccessorName) ? WXMLCodeDomGeneratorNameHelper.GetMultipleForm(entityRelation.Entity.Name) : entityRelation.AccessorName;

                var staticProperty = new CodeMemberProperty
                {
                    Name       = accessorName + "Relation",
                    HasGet     = true,
                    HasSet     = false,
                    Attributes = MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static,
                    Type       = relationDescType
                };

                var entityTypeExpression     = Settings.UseTypeInProps ? WXMLCodeDomGeneratorHelper.GetEntityClassTypeReferenceExpression(_settings, entityRelation.Entity, entityRelation.Entity.Namespace != _entity.Namespace || _entity.ScopeNames().Any(item => item == entityRelation.Entity.Name)) : WXMLCodeDomGeneratorHelper.GetEntityNameReferenceExpression(_settings, entityRelation.Entity, entityRelation.Entity.Namespace != _entity.Namespace || _entity.ScopeNames().Any(item => item == entityRelation.Entity.Name));
                var selfEntityTypeExpression = Settings.UseTypeInProps ? WXMLCodeDomGeneratorHelper.GetEntityClassTypeReferenceExpression(_settings, _entity, false) : WXMLCodeDomGeneratorHelper.GetEntityNameReferenceExpression(_settings, _entity, false);

                staticProperty.GetStatements.Add(
                    new CodeMethodReturnStatement(
                        new CodeObjectCreateExpression(
                            relationDescType,
                            new CodeObjectCreateExpression(
                                typeof(EntityUnion),
                                selfEntityTypeExpression
                                ),
                            new CodeObjectCreateExpression(
                                typeof(RelationDesc),
                                new CodeObjectCreateExpression(
                                    new CodeTypeReference(typeof(EntityUnion)),
                                    entityTypeExpression
                                    ),
                                WXMLCodeDomGeneratorHelper.GetFieldNameReferenceExpression(_settings, entityRelation.Property, entityRelation.Entity.Namespace != _entity.Namespace || _entity.ScopeNames().Any(item => item == entityRelation.Entity.Name)),
                                new CodePrimitiveExpression(entityRelation.Name ?? "default")
                                )
                            )
                        )
                    );

                Members.Add(staticProperty);

                string cd = new WXMLCodeDomGeneratorNameHelper(_settings).GetEntityClassName(entityRelation.Property.Entity, entityRelation.Entity.Namespace != _entity.Namespace || _entity.ScopeNames().Any(item => item == entityRelation.Entity.Name)) + ".Properties";
                //string dn = new WXMLCodeDomGeneratorNameHelper(_settings).GetEntityClassName(entityRelation.Entity, true) + ".Descriptor";

                //CodeDom.Field<string>(CodeDom.TypeRef(dn), "EntityName")

                CodeExpression exp = CodeDom.GetExpression((EntityUnion hostEntity) =>
                                                           new RelationDescEx(hostEntity, new RelationDesc(
                                                                                  new EntityUnion(CodeDom.InjectExp <string>(0)),
                                                                                  CodeDom.Field <string>(CodeDom.TypeRef_str(cd), entityRelation.Property.PropertyAlias),
                                                                                  entityRelation.Name
                                                                                  )), entityTypeExpression);

                Members.Add(Define.Method(MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static,
                                          typeof(RelationDescEx),
                                          (EntityUnion hostEntity) => "Get" + staticProperty.Name,
                                          Emit.@return(exp)
                                          ));

                Members.Add(Define.Method(MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static,
                                          typeof(RelationDescEx),
                                          (EntityUnion hostEntity, EntityUnion joinEntity) => "Get" + staticProperty.Name,
                                          Emit.@return((EntityUnion hostEntity, EntityUnion joinEntity) =>
                                                       new RelationDescEx(hostEntity, new RelationDesc(
                                                                              joinEntity,
                                                                              CodeDom.Field <string>(CodeDom.TypeRef_str(cd), entityRelation.Property.PropertyAlias),
                                                                              entityRelation.Name
                                                                              ))
                                                       )
                                          ));

                var memberProperty = new CodeMemberProperty
                {
                    Name       = accessorName,
                    HasGet     = true,
                    HasSet     = false,
                    Attributes =
                        MemberAttributes.Public | MemberAttributes.Final,
                    Type = new CodeTypeReference(typeof(RelationCmd))
                };

                if (!string.IsNullOrEmpty(entityRelation.AccessorDescription))
                {
                    WXMLCodeDomGenerator.SetMemberDescription(memberProperty, entityRelation.AccessorDescription);
                }

                memberProperty.GetStatements.Add(
                    new CodeMethodReturnStatement(
                        new CodeMethodInvokeExpression(
                            new CodeThisReferenceExpression(),
                            "GetCmd",
                            new CodePropertyReferenceExpression(
                                new CodePropertyReferenceExpression(
                                    null, //WXMLCodeDomGeneratorHelper.GetEntityClassReferenceExpression(_settings, _entity, false),
                                    staticProperty.Name
                                    ),
                                "Rel"
                                )
                            )
                        )
                    );
                Members.Add(memberProperty);

                _gen.RaisePropertyCreated(null, this, memberProperty, null);
            }
        }