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); + } } }