static void Main(string[] args) { try { // instance 생성 DynamicClass dynamicClass = new DynamicClass(); // NameSpace 정의 string nameSpace = "XyncStudio"; dynamicClass.AddNameSpace(nameSpace); // 추가할 Using string[] imports = { "InterfaceLib", "System", "System.Collections.Generic" }; // 상속받을 Interface string[] references = { "IPosition", "IID" }; // Class 생성 dynamicClass.AddClass(nameSpace, "StepNode", TypeAttributes.Public, imports, references); // Method 추가 string[] expressions = { }; Parameter[] param = { }; dynamicClass.AddMethod("StepNode", "SetPosition", System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Final, "", expressions, param); // Variable // Double 타입 public 변수 dynamicClass.AddVariable("StepNode", "width", Enumeration.VARIABLE_TYPE.Double.ToString(), MemberTypes.Field, System.CodeDom.MemberAttributes.Public); // Int32 static private변수 dynamicClass.AddVariable("StepNode", "height", Enumeration.VARIABLE_TYPE.Int32.ToString(), MemberTypes.Field, System.CodeDom.MemberAttributes.Private | System.CodeDom.MemberAttributes.Static); // string const private 변수 dynamicClass.AddVariable("StepNode", "nodeName", Enumeration.VARIABLE_TYPE.String.ToString(), MemberTypes.Field, System.CodeDom.MemberAttributes.Private); // 일반 적인 { get; set; } 형태 dynamicClass.AddVariable("StepNode", "TestProperty", Enumeration.VARIABLE_TYPE.String.ToString(), MemberTypes.Property, System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Final); // private 변수를 가지는 Get Set dynamicClass.AddVariable("StepNode", "TestProperty2", Enumeration.VARIABLE_TYPE.String.ToString(), MemberTypes.Property, System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Final, false); dynamicClass.AddVariable("StepNode", "Id", "Guid", MemberTypes.Property, System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Final); dynamicClass.AddVariable("StepNode", "Properties", "List<string>", MemberTypes.Field, System.CodeDom.MemberAttributes.Public); // string getMessage = string.Format($"Properties.Find(x => x == {'"'}Test{'"'});\n" + "int a = 0;"); // private 변수를 가지는 Get Set dynamicClass.AddVariable("StepNode", "TestString", Enumeration.VARIABLE_TYPE.String.ToString(), MemberTypes.Property, System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Final, getMessage); // Compile 할때 필요한 Dll 을 Parameter 로 Assembly assem = dynamicClass.CompileSource("System.dll", "InterfaceLib.dll"); if (assem != null) { Type fType = assem.GetTypes()[0]; Type iType = fType.GetInterface("InterfaceLib.IPosition"); if (iType != null) { InterfaceLib.IPosition position = (IPosition)assem.CreateInstance(fType.FullName); position.SetPosition(); } } Console.WriteLine($"NameSpace : {dynamicClass.TargetUnit.Namespaces[0].Name}"); #if DEBUG GenerateUtil.GenerateCSFile($"..\\Debug\\StepNode.cs", dynamicClass.TargetUnit); #else GenerateUtil.GenerateCSFile($"..\\Release\\StepNode.cs", dynamicClass.TargetUnit); #endif } catch (Exception e) { Console.WriteLine(e.Message); } }
static void Main(string[] args) { try { // instance 생성 DynamicClass dynamicClass = new DynamicClass(); #region NameSpace, import, implement, class 생성 // NameSpace 정의 string nameSpace = "XyncStudio"; dynamicClass.AddNameSpace(nameSpace); // 추가할 Using string[] imports = { "InterfaceLib", "System", "System.Collections.Generic" }; // 상속받을 Interface string[] references = { "IPosition", "IID" }; // Class 생성 dynamicClass.AddClass(nameSpace, "StepNode", TypeAttributes.Public, imports, references); #endregion #region Add Method // Method 추가 string[] expressions = { }; Parameter[] param = { }; dynamicClass.AddMethod("StepNode", "SetPosition", System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Final, typeof(void), expressions, param); string[] expressions1 = { "return a + b;" }; Parameter[] param1 = { new Parameter(typeof(int), "a"), new Parameter(typeof(int), "b") }; dynamicClass.AddMethod("StepNode", "OnPlus", System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Final, typeof(int), expressions1, param1); #endregion #region Member Variable // 1. Field Member // double 타입 public 변수 dynamicClass.AddField("StepNode", "width", typeof(double), System.CodeDom.MemberAttributes.Public); // Int32 static private변수 dynamicClass.AddField("StepNode", "height", typeof(Int32), System.CodeDom.MemberAttributes.Private | System.CodeDom.MemberAttributes.Static); // Field Member 를 New 할 수 있음 dynamicClass.AddField("StepNode", "undoStack", typeof(List <string>), System.CodeDom.MemberAttributes.Public, true); // Filed Member이면서 Get을 가지고 있고 New 할 수 있는 함수 //dynamicClass.AddField("StepNode", "GuideNode", typeof(List<string>), System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.AccessMask, false, true); // 2. Property // 일반 적인 { get; set; } 형태 dynamicClass.AddProperty("StepNode", "userName", typeof(string), System.CodeDom.MemberAttributes.Public); // Guid Id { get; set; } 형태 dynamicClass.AddProperty("StepNode", "Id", typeof(Guid), System.CodeDom.MemberAttributes.Public); // Private 변수를 Value로 가지는 Member Property dynamicClass.AddProperty("StepNode", "IndexNumber", typeof(float), System.CodeDom.MemberAttributes.Public, false); // Get을 가지고 있고 return을 입력할 수 있는 Property dynamicClass.AddField("StepNode", "Properties", typeof(List <string>), System.CodeDom.MemberAttributes.Public); string getMessage = string.Format($"Properties.Find(x => x == {'"'}Test{'"'});\n" + "int a = 0;"); dynamicClass.AddPropertyHasGet("StepNode", "TestString", typeof(string), System.CodeDom.MemberAttributes.Public, getMessage); dynamicClass.AddPropertyHasGet("StepNode", "volume", typeof(int), System.CodeDom.MemberAttributes.Public, "1+1"); //string getMessage1 = string.Format("this[\"Name\"] as string };"); //dynamicClass.AddPropertyHasGet("StepNode", "Name", typeof(string), System.CodeDom.MemberAttributes.Public, "this[\"Name\"] as string }"); #endregion // Compile 할때 필요한 Dll 을 Parametaer 로 Assembly assem = dynamicClass.CompileSource("System.dll", "InterfaceLib.dll"); if (assem != null) { Type fType = assem.GetTypes()[0]; Type iType = fType.GetInterface("InterfaceLib.IPosition"); if (iType != null) { InterfaceLib.IPosition position = (IPosition)assem.CreateInstance(fType.FullName); position.SetPosition(); } } Console.WriteLine($"NameSpace : {dynamicClass.TargetUnit.Namespaces[0].Name}"); #if DEBUG GenerateUtil.GenerateCSFile($"..\\Debug\\StepNode.cs", dynamicClass.TargetUnit); #else GenerateUtil.GenerateCSFile($"..\\Release\\StepNode.cs", dynamicClass.TargetUnit); #endif } catch (Exception e) { Console.WriteLine(e.Message); } }