[英]Enum.GetValues() Return Type
我已經閱讀了說明“給定枚舉的類型,System.Enum 的 GetValues() 方法將返回給定枚舉的基本類型的數組”的文檔,即 int、byte 等。
但是,我一直在使用 GetValues() 方法,而我得到的只是一個 Enums 類型的數組。 我錯過了什么嗎?
public enum Response
{
Yes = 1,
No = 2,
Maybe = 3
}
foreach (var value in Enum.GetValues(typeof(Response)))
{
var type = value.GetType(); // type is always of type Enum not of the enum base type
}
您需要將結果轉換為您想要的實際數組類型
(Response[])Enum.GetValues(typeof(Response))
因為 GetValues 不是強類型的
編輯:只需重新閱讀答案。 您需要將每個枚舉值顯式轉換為基礎類型,因為 GetValues 返回實際枚舉類型而不是基類型的數組。 Enum.GetUnderlyingType 可以幫助解決這個問題。
如果您使用 NET 3.5(即您有 LINQ),您可以執行以下操作:
var responses = Enum.GetValues(typeof(Response)).Cast<Response>();
我個人在我的 Utils 項目中創建了一個單獨的方法,我將其包含在我的其他項目中。 這是我使用的代碼:
public static class EnumUtil
{
public static IEnumerable<TEnum> GetAllValues<TEnum>()
where TEnum : struct, IConvertible, IComparable, IFormattable
{
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
}
}
我這樣稱呼它:
var enumValues = EnumUtil.GetAllValues<Response>();
您能否參考您提到的文檔。 Enum.GetValues
上的文檔沒有提到類似的內容(引自該頁面):
返回值
類型:System.Array
enumType 中常量值的數組。 數組元素按枚舉常量的二進制值排序。
正如Roger在評論中提到的,如果有Enum.GetValues<MyEnum>()
通用實現會很好,但沒有。
這個問題也讓我很惱火,所以我在 C++/CLI 中創建了一個庫,它具有Enum
類上所有靜態方法的通用實現(以及一堆其他用於處理枚舉的通用方法) .
該庫是用 C++/CLI 編寫的,因為 C# 不支持通過 System.Enum 約束泛型類型。 C++/CLI(和 CLR)確實支持 System.Enum 的約束,並且 C#/VB.NET 可以毫無問題地理解對具有此約束的方法的調用。
在您的示例的情況下,您將使用Enums.GetValues<MyEnumType>()
它將為您提供一個MyEnumType
數組,而無需進行轉換。 盡管 C# 和 VB.Net 不支持定義枚舉約束,但它們在使用具有此類約束的方法/類方面沒有問題,並且智能感知/編譯器可以完美地處理它。
類似於喬爾的回答,但方式略有不同:
public static class Enums<T>
where T : struct, IComparable, IFormattable, IConvertible
{
static Enums()
{
if (!typeof(T).IsEnum)
throw new ArgumentException("Type T must be an Enum type");
}
public static IEnumerable<T> GetValues()
{
var result = ((T[])Enum.GetValues(typeof(T)).ToList()
return result;
}
}
用法:
IEnumerable<System.Drawing.FontStyle> styles = Enums<System.Drawing.FontStyle>.GetValues();
如果您使用的是 .NET 5+,您現在可以使用Enum.GetValues<TEnum>()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.