From ae5f92721b8d4a39df6cd58ee21a01d5462a55e4 Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 29 Oct 2021 15:44:28 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91=E6=94=BE?= =?UTF-8?q?=E6=9D=BE=E5=AF=B9enum=E5=A1=AB=E6=B3=95=E7=9A=84=E8=A6=81?= =?UTF-8?q?=E6=B1=82=EF=BC=8C=E5=85=81=E8=AE=B8=E5=A1=AB=E5=90=88=E6=B3=95?= =?UTF-8?q?=E7=9A=84=E6=95=B4=E6=95=B0=E6=9E=9A=E4=B8=BE=E5=80=BC=E4=BA=86?= =?UTF-8?q?=20=E3=80=90=E8=B0=83=E6=95=B4=E3=80=91=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=BC=BA=E8=BF=AB=E6=9E=9A=E4=B8=BE=E5=80=BC=E5=94=AF=E4=B8=80?= =?UTF-8?q?=EF=BC=8C=E5=87=8F=E5=B0=91=E6=84=8F=E5=A4=96=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/Defs/CommonDefLoader.cs | 3 ++- src/Luban.Job.Common/Source/Defs/DefEnum.cs | 23 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs b/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs index 46f7c75..0b9bc92 100644 --- a/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs +++ b/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs @@ -296,7 +296,7 @@ namespace Luban.Job.Common.Defs private static readonly List _enumRequiredAttrs = new List { "name" }; - private static readonly List _enumItemOptionalAttrs = new List { "value", "alias", "comment", "tags" }; + private static readonly List _enumItemOptionalAttrs = new List { "value", "alias", "comment", "tags", "unique" }; private static readonly List _enumItemRequiredAttrs = new List { "name" }; protected void AddEnum(string defineFile, XElement e) @@ -309,6 +309,7 @@ namespace Luban.Job.Common.Defs Comment = XmlUtil.GetOptionalAttribute(e, "comment"), IsFlags = XmlUtil.GetOptionBoolAttribute(e, "flags"), Tags = XmlUtil.GetOptionalAttribute(e, "tags"), + IsUniqueItemId = XmlUtil.GetOptionBoolAttribute(e, "unique", true), }; foreach (XElement item in e.Elements()) diff --git a/src/Luban.Job.Common/Source/Defs/DefEnum.cs b/src/Luban.Job.Common/Source/Defs/DefEnum.cs index d47895d..82f9fd2 100644 --- a/src/Luban.Job.Common/Source/Defs/DefEnum.cs +++ b/src/Luban.Job.Common/Source/Defs/DefEnum.cs @@ -47,6 +47,8 @@ namespace Luban.Job.Common.Defs private readonly Dictionary _nameOrAlias2Value = new(); + private readonly Dictionary _vaule2Name = new(); + public bool TryValueByNameOrAlias(string name, out int value) { return _nameOrAlias2Value.TryGetValue(name, out value); @@ -74,9 +76,17 @@ namespace Luban.Job.Common.Defs { return value; } + else if (int.TryParse(name, out value)) + { + if (!_vaule2Name.ContainsKey(value)) + { + throw new Exception($"{value} 不是 enum:'{FullName}'的有效枚举值"); + } + return value; + } else { - throw new Exception($"'{name}' 不是有效 枚举:'{FullName}' 值"); + throw new Exception($"'{name}' 不是enum:'{FullName}'的有效枚举值"); } } @@ -169,6 +179,17 @@ namespace Luban.Job.Common.Defs { throw new Exception($"enum:'{fullName}' 枚举名:'{Name}' alias:'{item.Alias}' 重复"); } + if (_vaule2Name.TryGetValue(item.IntValue, out var itemName)) + { + if (IsUniqueItemId) + { + throw new Exception($"enum:'{fullName}' 枚举值:{item.IntValue} 重复. 枚举名:'{itemName}' <=> '{item.Name}'"); + } + } + else + { + _vaule2Name.Add(item.IntValue, item.Name); + } } }