枚舉型(或簡稱為枚舉型)是整數型別的精簡語言封裝。 當您從一組封閉的值中儲存一個值時,您可能會想要將其使用限制為 。 以大小(小、中、大)為基礎的分類是一個很好的例子。 使用枚舉來控制流程或更強固的抽象概念可能是一種程式異味。 這種類型的使用方式會導致具有許多控制流程語句檢查列舉值的脆弱程序代碼。
相反地,您可以建立列舉類別,以啟用面向對象語言的所有豐富功能。
不過,這不是重要的主題,在許多情況下,為了簡單起見,如果您偏好的話,您仍然可以使用一般 列舉類型 。 列舉類別的使用與商務相關概念更相關。
實現列舉基礎類別
eShopOnContainers 中的訂單微服務提供範例的列舉基類實作,如下列範例所示:
public abstract class Enumeration : IComparable
{
public string Name { get; private set; }
public int Id { get; private set; }
protected Enumeration(int id, string name) => (Id, Name) = (id, name);
public override string ToString() => Name;
public static IEnumerable<T> GetAll<T>() where T : Enumeration =>
typeof(T).GetFields(BindingFlags.Public |
BindingFlags.Static |
BindingFlags.DeclaredOnly)
.Select(f => f.GetValue(null))
.Cast<T>();
public override bool Equals(object obj)
{
if (obj is not Enumeration otherValue)
{
return false;
}
var typeMatches = GetType().Equals(obj.GetType());
var valueMatches = Id.Equals(otherValue.Id);
return typeMatches && valueMatches;
}
public int CompareTo(object other) => Id.CompareTo(((Enumeration)other).Id);
// Other utility methods ...
}
您可以使用這個類別做為任何實體或值物件中的類型,如下列 CardType 類別 Enumeration 所示:
public class CardType
: Enumeration
{
public static CardType Amex = new(1, nameof(Amex));
public static CardType Visa = new(2, nameof(Visa));
public static CardType MasterCard = new(3, nameof(MasterCard));
public CardType(int id, string name)
: base(id, name)
{
}
}
其他資源
吉米·博加德 列舉類別
https://lostechies.com/jimmybogard/2008/08/12/enumeration-classes/史蒂夫·史密斯 C# 中的列舉型別選項
https://ardalis.com/enum-alternatives-in-cEnumeration.cs。 eShopOnContainers 中的基底列舉類別
https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/SeedWork/Enumeration.csCardType.cs。 eShopOnContainers 系統中的列舉類別範例。
https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/CardType.csSmartEnum。 Ardalis - 協助在 .NET 中創建強型別智能枚舉的類別。
https://www.nuget.org/packages/Ardalis.SmartEnum/