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
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 |
|
} |
|
} |
|
} |