更改表结构,以减少二次映射
This commit is contained in:
@@ -7,16 +7,6 @@ namespace ExcelTool.Parser
|
||||
{
|
||||
public static class GenModels
|
||||
{
|
||||
// ── 枚举类型映射(key: 小写类型名,value: C# 枚举类型名)──────────────
|
||||
// 新增枚举类型只改这里
|
||||
private static readonly Dictionary<string, string> EnumMap = new()
|
||||
{
|
||||
{ "killmode", "KillMode" },
|
||||
{ "mixingtype", "MixingType" },
|
||||
{ "containertype", "ContainerType" },
|
||||
{ "blendcrossfadetype","BlendCrossFadeType" },
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 生成对应的 C# Model 类
|
||||
/// </summary>
|
||||
@@ -37,7 +27,7 @@ namespace ExcelTool.Parser
|
||||
for (int sheetNum = 0; ; sheetNum++)
|
||||
{
|
||||
var headers = ExcelHelper.ExcelHeaders(fileName, out string sheetName, out int sheetCount, sheetNum);
|
||||
if (headers == null || headers.Count == 0 || sheetName.StartsWith('#') || sheetNum > sheetCount)
|
||||
if (headers == null || headers.Count == 0 || sheetName.StartsWith("#") || sheetNum > sheetCount)
|
||||
break;
|
||||
|
||||
var sb = new StringBuilder();
|
||||
@@ -109,13 +99,6 @@ namespace ExcelTool.Parser
|
||||
var type = header.FieldType.ToLower();
|
||||
var name = header.FieldName;
|
||||
|
||||
// 枚举
|
||||
if (EnumMap.TryGetValue(type, out var enumCsType))
|
||||
{
|
||||
sb.Append($"\t\t{name} = ({enumCsType})reader.ReadByte();\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 注册表中的具名类型
|
||||
var desc = TypeRegistry.Get(type);
|
||||
if (desc != null)
|
||||
@@ -133,13 +116,12 @@ namespace ExcelTool.Parser
|
||||
$"list<T> 的元素类型 \"{elemType}\" 未注册 ({sheetName})".WriteErrorLine();
|
||||
continue;
|
||||
}
|
||||
// 读取表达式复用注册表中的 GenDeserialize 只取 ReadXxx() 部分比较麻烦,
|
||||
// 这里直接用公共辅助方法生成片段
|
||||
sb.Append(TypeRegistry.GenListDeserialize(name, elemDesc.CSharpType, GetReadExpr(elemDesc)));
|
||||
continue;
|
||||
}
|
||||
|
||||
$"类型 \"{type}\" 未注册,{sheetName} 处理异常".WriteErrorLine();
|
||||
// 兜底:当枚举处理,类型名直接用 FieldType 原值(保留大小写)
|
||||
sb.Append($"\t\t{name} = ({header.FieldType})reader.ReadByte();\n");
|
||||
}
|
||||
|
||||
sb.Append("\t}\n");
|
||||
@@ -158,13 +140,6 @@ namespace ExcelTool.Parser
|
||||
var type = header.FieldType.ToLower();
|
||||
var name = header.FieldName;
|
||||
|
||||
// 枚举
|
||||
if (EnumMap.ContainsKey(type))
|
||||
{
|
||||
sb.Append($"\t\twriter.Write((byte){name});\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 注册表
|
||||
var desc = TypeRegistry.Get(type);
|
||||
if (desc != null)
|
||||
@@ -180,7 +155,8 @@ namespace ExcelTool.Parser
|
||||
continue;
|
||||
}
|
||||
|
||||
$"类型 \"{type}\" 未注册,{sheetName} 处理异常".WriteErrorLine();
|
||||
// 兜底:当枚举处理
|
||||
sb.Append($"\t\twriter.Write((byte){name});\n");
|
||||
}
|
||||
|
||||
sb.Append("\t}\n");
|
||||
@@ -230,9 +206,6 @@ namespace ExcelTool.Parser
|
||||
{
|
||||
var lower = fieldType.ToLower();
|
||||
|
||||
if (EnumMap.TryGetValue(lower, out var enumType))
|
||||
return enumType;
|
||||
|
||||
var desc = TypeRegistry.Get(lower);
|
||||
if (desc != null)
|
||||
return desc.CSharpType;
|
||||
@@ -244,8 +217,8 @@ namespace ExcelTool.Parser
|
||||
return elemDesc != null ? $"List<{elemDesc.CSharpType}>" : $"List<{elemType}>";
|
||||
}
|
||||
|
||||
// 兜底:直接用原始类型名(可能是用户自定义类型)
|
||||
return fieldType.ToLower();
|
||||
// 兜底:当枚举处理,保留原始类型名大小写
|
||||
return fieldType;
|
||||
}
|
||||
|
||||
/// <summary>尝试解析 list<T> 语法,成功返回元素类型名</summary>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
@@ -10,13 +10,6 @@ namespace ExcelTool.Parser
|
||||
{
|
||||
try
|
||||
{
|
||||
Dictionary<string, string> enumMap = new()
|
||||
{
|
||||
{ "killmode", "byte" },
|
||||
{ "mixingtype", "byte" },
|
||||
{ "containertype", "byte" },
|
||||
{ "blendcrossfadetype", "byte" }
|
||||
};
|
||||
FileInfo fileInfo = new(fileName);
|
||||
if (string.IsNullOrEmpty(outputDir))
|
||||
{
|
||||
@@ -44,9 +37,10 @@ namespace ExcelTool.Parser
|
||||
var type = tableData.Headers[i].FieldType.ToLower();
|
||||
var data = row.StrList[i];
|
||||
|
||||
if (enumMap.ContainsKey(type))
|
||||
// 未在 TypeRegistry 注册的类型(且不是 list<T>)当枚举处理,写入 byte
|
||||
if (!TypeRegistry.Contains(type) && !IsGenericList(type))
|
||||
{
|
||||
type = enumMap[type];
|
||||
type = "byte";
|
||||
}
|
||||
|
||||
datas.Add(new Tuple<string, string>(type, data));
|
||||
@@ -63,5 +57,8 @@ namespace ExcelTool.Parser
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static bool IsGenericList(string type) =>
|
||||
type.StartsWith("list<") && type.EndsWith(">");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user