You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

151 lines
5.1 KiB

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.CSharp;
namespace Tools.ExcelResolver.Editor
{
public sealed partial class ExcelResolverEditorWindow
{
private void WriteSOCode(ClassCodeData classCodeData)
{
string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}Util.cs";
CodeCompileUnit compileUnit = new CodeCompileUnit();
#region 命名空间
CodeNamespace codeNamespace = new CodeNamespace(excelResolverConfig.GenerateDataClassNameSpace);
compileUnit.Namespaces.Add(codeNamespace);
#endregion
#region 引用
string[] classImports = new string[]
{
"System",
"System.Collections",
"System.Collections.Generic",
"UnityEngine",
"Sirenix.OdinInspector",
};
foreach (var import in classImports)
{
codeNamespace.Imports.Add(new CodeNamespaceImport(import));
}
#endregion
#region 类
CodeTypeDeclaration classType = new CodeTypeDeclaration($"{classCodeData.className}Util")
{
IsClass = true,
TypeAttributes = System.Reflection.TypeAttributes.Public,
BaseTypes =
{
new CodeTypeReference("SerializedScriptableObject"),
new CodeTypeReference("IExcelSOUtil"),
}
};
codeNamespace.Types.Add(classType);
#endregion
#region 字段
List<CodeMemberField> codeFields = new List<CodeMemberField>();
switch (classCodeData.tableType)
{
case TableType.SingleKeyTable:
{
FieldData keyField = classCodeData.keyField.First();
CodeMemberField codeField =
new CodeMemberField($"Dictionary<{keyField.type.FieldWriteFormat}, {classCodeData.className}>", "Data")
{
Attributes = MemberAttributes.Public,
};
codeFields.Add(codeField);
break;
}
case TableType.UnionMultiKeyTable:
{
var sb = new System.Text.StringBuilder();
foreach (var keyField in classCodeData.keyField)
{
sb.Append(keyField.type.FieldWriteFormat);
sb.Append(", ");
}
sb.Remove(sb.Length - 2, 2);
CodeMemberField codeField =
new CodeMemberField($"Dictionary<({sb}), {classCodeData.className}>", "Data")
{
Attributes = MemberAttributes.Public,
};
codeFields.Add(codeField);
break;
}
case TableType.MultiKeyTable:
{
// 获取所有键的类型
var keyTypes = classCodeData.keyField.Select(k => k.type.FieldWriteFormat).ToList();
// 动态生成嵌套字典的类型字符串
string dictType = classCodeData.className; // 最内层的值类型
for (int i = keyTypes.Count - 1; i >= 0; i--)
{
dictType = $"Dictionary<{keyTypes[i]}, {dictType}>";
}
// 创建字段
CodeMemberField codeField = new CodeMemberField(dictType, "Data")
{
Attributes = MemberAttributes.Public,
};
codeFields.Add(codeField);
break;
}
case TableType.NotKetTable:
break;
case TableType.ColumnTable:
break;
default:
throw new ArgumentOutOfRangeException();
}
foreach (var codeField in codeFields)
{
classType.Members.Add(codeField);
}
#endregion
#region 代码风格设置
CodeGeneratorOptions options = new CodeGeneratorOptions
{
BracingStyle = "C",
BlankLinesBetweenMembers = true,
VerbatimOrder = true,
};
#endregion
#region 写入文件
using (StreamWriter writer = new StreamWriter(outputPath))
{
CSharpCodeProvider provider = new CSharpCodeProvider();
provider.GenerateCodeFromCompileUnit(compileUnit, writer, options);
}
#endregion
}
}
}