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