簡體   English   中英

C#Enum.GetValues()-使用非框對象

[英]C# Enum.GetValues() - using non-boxed object

我正在嘗試編寫一個通用方法,該方法將在通過枚舉時返回特定的標記。 下面是減少到該問題所需的最少代碼的方法。

    public static string GetMarkup(Type enumType)
    {
        StringBuilder builder = new StringBuilder();
        foreach (var val in Enum.GetValues(enumType))
        {
            builder.Append(val.ToString());
        }
        return builder.ToString();
    }

像這樣調用該方法,其中CopyType是一個枚舉:

    GetDropDownListHtml(typeof(CopyType))

目標是能夠調用為傳遞給此方法的枚舉編寫的ToString()擴展方法。 問題在於,要使該方法通用,我需要使用var在foreach聲明中聲明我的變量,但是將其裝箱。 我有一個裝箱的CopyType對象,而不是CopyType的枚舉。

作為回應,我嘗試了許多這樣的想法,但無濟於事:

    ((typeof(enumType))val.ToString()

有任何想法嗎?

無法使用擴展方法對特定的枚舉執行此操作。 您要么需要擴展您的擴展方法以支持所有Enum類型,要么在其中添加一個is語句(僅在必要時才能進行強制轉換),或者為此函數編寫特殊的重載(僅針對此類枚舉)。 這與擴展方法的實際實現方式有關。

編譯器將擴​​展方法轉換為其靜態形式: myCopyType.ToString() CopyType.ToString(myCopyType)在編譯時變為CopyType.ToString(myCopyType) 但是對於您的方案(甚至是泛型),編譯器無法告訴您使用哪種類型,因為直到運行時才確定類型。

剩下上面的三個選擇。

在我自己的代碼中,基於此處的代碼,我選擇了第一個選項。 您將可以在任何Enum類型上調用.GetLabel() ,並且可以在此標簽上專門放置特殊標簽。

另外,您需要使用foreach (Enum val in ...以確保編譯器知道它是Enum

暫無
暫無

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

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