簡體   English   中英

Enum.GetValues() 返回類型

[英]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>()

https://docs.microsoft.com/en-us/dotnet/api/system.enum.getvalues?view=net-6.0#system-enum-getvalues-1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM