[英]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.