using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.Reflection; public class GenerateClass { private string _classPath; //生成脚本路径 private CodeNamespace _codeNamespace;//命名空间 public CodeTypeDeclaration _customerClass; private CodeCompileUnit _unit; public GenerateClass(string classPath) { _classPath = classPath; } /// /// 创建命名空间 /// /// public void GenerateNamespace(string spaceName) { _unit = new CodeCompileUnit(); _codeNamespace = new CodeNamespace(spaceName); _unit.Namespaces.Add(_codeNamespace); } /// /// 添加引入的命名空间 /// /// public void AddImportNamespace(string spaceName) { if (_codeNamespace == null) { DesignDebug.Log("_codeNamespace is null"); return; } _codeNamespace.Imports.Add(new CodeNamespaceImport(spaceName)); } /// /// 创建类名 /// /// public void GenerateClassName(string className, string extendClass = "") { if (_codeNamespace == null) { DesignDebug.Log("_codeNamespace is null"); return; } _customerClass = new CodeTypeDeclaration(className); _customerClass.IsClass = true; _customerClass.IsPartial = true; _customerClass.TypeAttributes = TypeAttributes.Public; if (!string.IsNullOrEmpty(extendClass)) { _customerClass.BaseTypes.Add(extendClass); } _codeNamespace.Types.Add(_customerClass); } /// /// 添加熟悉 /// /// /// public void AddMemberField(Type type, string srcFieldName, string fieldName, string CommentStatement) { if (type == null) { UnityEngine.Debug.LogError(_customerClass.Name + " " + srcFieldName + "`s type is Null"); return; } CodeMemberField field = new CodeMemberField(type, fieldName); field.Attributes = MemberAttributes.Private; _customerClass.Members.Add(field); CodeMemberProperty property = new CodeMemberProperty(); property.Attributes = MemberAttributes.Public | MemberAttributes.Final; property.Name = srcFieldName; property.HasGet = true; property.HasSet = false; property.Type = new CodeTypeReference(type); property.Comments.Add(new CodeCommentStatement(CommentStatement)); property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName))); //property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName), new CodePropertySetValueReferenceExpression())); _customerClass.Members.Add(property); } /// /// 添加方法 /// public void AddFunction(string funcName, MemberAttributes memberAtt, List> paramLst, List statementLst, Type returanType) { //为这个类添加一个方法 public override int 方法名(string str); System.CodeDom.CodeMemberMethod method = new CodeMemberMethod(); method.Name = funcName; method.Attributes = memberAtt;//声明方法是公开 并且override的 if (paramLst != null) { for (int i = 0; i < paramLst.Count; i++) { method.Parameters.Add(new CodeParameterDeclarationExpression(paramLst[i].Key, paramLst[i].Value)); } } if (statementLst != null) { for (int i = 0; i < statementLst.Count; i++) { method.Statements.Add(new CodeSnippetStatement(statementLst[i])); } } method.ReturnType = new CodeTypeReference(returanType);//声明返回值的类型 _customerClass.Members.Add(method); } /// /// 写入文件 /// public void WriteToFile() { _customerClass.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(SerializableAttribute)))); //生成代码 CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CodeGeneratorOptions options = new CodeGeneratorOptions(); options.BracingStyle = "C"; options.BlankLinesBetweenMembers = true; using (System.IO.StreamWriter sw = new System.IO.StreamWriter(_classPath)) { provider.GenerateCodeFromCompileUnit(_unit, sw, options); } } }