动态生成C#代码cs文件_CSharp

动态生成脚本文件(不能添加到程序集),根据数据群代码生成完整的C#脚本文件,例如根据数据库等自动生成接口、类、结构、或者枚举等,

 

需要用到的引用:

using System.CodeDom;

using System.CodeDom.Compiler;

using System.Reflection;

//实例

    public static void BuildClass(string className)

        {

            //准备一个代码编译器单元

            CodeCompileUnit unit = new CodeCompileUnit();

 

            //设置命名空间(这个是指要生成的类的空间)

            CodeNamespace myNamespace = new CodeNamespace("Joh.Test");

 

            //导入必要的命名空间引用

            myNamespace.Imports.Add(new CodeNamespaceImport("System"));

            myNamespace.Imports.Add(new CodeNamespaceImport("UnityEngine"));

 

            //Code:代码体

            CodeTypeDeclaration myClass = new CodeTypeDeclaration(className);

 

            //指定为类

            myClass.IsClass = true;

            //设置类的访问类型

            myClass.TypeAttributes = TypeAttributes.Public;// | TypeAttributes.Sealed;

            //把这个类放在这个命名空间下

            myNamespace.Types.Add(myClass);

            //把该命名空间加入到编译器单元的命名空间集合中

            unit.Namespaces.Add(myNamespace);

 

 

            //添加字段

            CodeMemberField field = new CodeMemberField(typeof(System.String), "str");

            //设置访问类型

            field.Attributes = MemberAttributes.Private;

            ///添加到myClass类中

            myClass.Members.Add(field);

 

            //添加属性

            CodeMemberProperty property = new CodeMemberProperty();

            //设置访问类型

            property.Attributes = MemberAttributes.Public | MemberAttributes.Final;

            //对象名称

            property.Name = "Str";

            //有get

            property.HasGet = true;

            //有set

            property.HasSet = true;

            //设置property的类型            

            property.Type = new CodeTypeReference(typeof(System.String));

            //添加注释

            property.Comments.Add(new CodeCommentStatement("this is Str"));

            //get

            property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "str")));

            //set

            property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "str"), new CodePropertySetValueReferenceExpression()));

            ///添加到Customerclass类中

            myClass.Members.Add(property);

 

            //添加方法

            CodeMemberMethod method = new CodeMemberMethod();

            //方法名

            method.Name = "Function";

            //访问类型

            method.Attributes = MemberAttributes.Public | MemberAttributes.Final;

            //添加一个参数

            method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "number"));          

            //设置返回值类型:int/不设置则为void

            method.ReturnType = new CodeTypeReference(typeof(int));

            //设置返回值

            method.Statements.Add(new CodeSnippetStatement(" return number+1; "));

            ///将方法添加到myClass类中

            myClass.Members.Add(method);

 

 

            //添加构造方法

            CodeConstructor constructor = new CodeConstructor();

            constructor.Attributes = MemberAttributes.Public;

            ///将构造方法添加到myClass类中

            myClass.Members.Add(constructor);

            

            //添加特特性

            myClass.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(SerializeField))));

 

            //生成C#脚本("VisualBasic":VB脚本)

            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

 

            CodeGeneratorOptions options = new CodeGeneratorOptions();

            //代码风格:大括号的样式{}

            options.BracingStyle = "C";

 

            //是否在字段、属性、方法之间添加空白行

            options.BlankLinesBetweenMembers = true;

 

            //输出文件路径

            string outputFile = Application.dataPath + "/Scripts/" + className + ".cs";

            //保存

            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(outputFile))

            {

                //为指定的代码文档对象模型(CodeDOM) 编译单元生成代码并将其发送到指定的文本编写器,使用指定的选项。(官方解释)

                //将自定义代码编译器(代码内容)、和代码格式写入到sw中

                provider.GenerateCodeFromCompileUnit(unit, sw, options);

            }

        }

 

 

 

注释:

MemberAttributes(enum)

Abstract = 1,//抽象

Final = 2,//派生类中不能重写

Static = 3,//静态

Override = 4,//重写基类

Const = 5,//常数

ScopeMask = 15,//范围屏蔽

New = 16,//新的

VTableMask = 240,//

        Overloaded = 256,//可以被重写

        Assembly = 4096,//统一程序集可以访问

        FamilyAndAssembly = 8192,//protected并且在统一程序集

        Family = 12288,//protected

        FamilyOrAssembly = 16384,//protected 在统一程序集

        Private = 20480,//

        Public = 24576,//

        AccessMask = 61440//访问屏蔽

你可能感兴趣的:(C#)