我面临着一个大 Enum 文件的可扩展性问题,该文件有超过 1700 条记录。
我必须向此枚举添加更多记录,并且我正在考虑创建一个新的枚举文件以避免添加更多的现有枚举文件。这也允许按域分隔枚举类型。
问题是这不起作用,当我在新代码中调用该函数时,我必须更改、复制或强制转换采用此枚举类型的每个函数。
这个旧的 Enum 文件是超时手动创建和更新的,它不是从数据库生成的。该项目的年龄非常非常长(可能超过15年)。
有什么解决办法吗?
namespace SomeNameSpace
{
public enum OldBigListDoneBySomeIrresponsiveDev
{
[FriendlyName("Unknown")]
Unknown = 0,
[FriendlyName("Page1")]
Page1_Summary = 100000,
[FriendlyName("Page2")]
Page2_Summary = 100101,
[FriendlyName("Page3")]
Page3_Summary = 100102,
// .....
Page1700_Summary = 107102,
}
}
namespace SomeNameSpace2
{
public class SomeAttribute: FilterAttribute
{
public CheckEnumAttributeAttribute()
{
this.Order = 0;
}
/// <summary>
/// Gets or sets the OldBigListDoneBySomeIrresponsiveDev
/// </summary>
public OldBigListDoneBySomeIrresponsiveDev AttrID { get; set; }
}
}
// attempt to improve
namespace SomeNameSpace
{
public enum SmallerNicerEnumList
{
[FriendlyName("Unknown")]
Unknown = 0,
[FriendlyName("Page2000")]
Page2000_Summary = 100000,
[FriendlyName("Page2001")]
Page2001_Summary = 100101,
[FriendlyName("Page2002")]
Page2002_Summary = 100102,
}
}
// tenative usage of the attribute with new Enum
SomeAttribute(AttrID = SmallerNicerEnumList.Page2000_Summary)
public void SomeController(){}
引发错误:无法将类型从
SmallerNicerEnumList
隐式转换为 OldBigListDoneBySomeIrresponsiveDev
您可以将
enum
转换为 record
并使用 record
代替,它可以制成 partial
,也可以用 implicit
等进行扩展,使其像 enum
一样工作.
这是控制台应用程序的代码示例:
Console.WriteLine(BigEnum.Unknown.ToString());
Console.WriteLine((string)BigEnum.Unknown);
Console.WriteLine((int)BigEnum.Unknown);
Console.WriteLine(BigEnum.Page2_Summary.ToString());
Console.WriteLine((string)BigEnum.Page2_Summary);
Console.WriteLine((int)BigEnum.Page2_Summary);
public partial record BigEnum(int Id, string Name)
{
public static BigEnum Unknown => new(0, "Unknown");
public static BigEnum Page1_Summary => new(100000, "Page1");
public override string ToString() => Name;
public static implicit operator int(BigEnum bigEnum) => bigEnum.Id;
public static implicit operator string(BigEnum bigEnum) => bigEnum.Name;
}
public partial record BigEnum
{
public static BigEnum Page2_Summary => new(100101, "Page2");
}