动态生成脚本文件(不能添加到程序集),根据数据群代码生成完整的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//访问屏蔽