有沒有辦法創建一個方法來獲取一個枚舉類型作爲參數,並從它的值返回枚舉底層類型的通用列表,無論底層類型是int \短字節等'...
我看到了Jon Skeet的this answer,但它看起來太複雜了。C#:枚舉值的通用列表
回答
如果你想在一個Type
通過,它不能真正有效地通用的 - 你必須返回一個類型不直接與輸入,因此這樣的:
public static Array GetUnderlyingEnumValues(Type type)
{
Array values = Enum.GetValues(type);
Type underlyingType = Enum.GetUnderlyingType(type);
Array arr = Array.CreateInstance(underlyingType, values.Length);
for (int i = 0; i < values.Length; i++)
{
arr.SetValue(values.GetValue(i), i);
}
return arr;
}
這是下一個強類型的載體,所以你可以強制轉換成int[]
等
你可以設置方法來獲取Enum類型作爲一個泛型參數,但它不會改變一個東西,對吧? – gdoron
@gdoron確實有它'
雖然馬克的回答是沒有錯的有點不必要。 Enum.GetValues(type)
返回一個TEnum[]
,所以這種方法是不必要的,因爲如果您知道底層類型,您可以將其TEnum[]
投射到其基礎類型數組。
var underlyingArray = (int[])Enum.GetValues(typeof(StringComparison));
是有效的C#,將編譯並在運行時不會拋出異常。既然你需要一個列表,你可以將它傳遞給List<Tunderlying>
構造函數,或者你可以調用ToArray()
擴展方法。
編輯:你可以寫的功能,例如::
public static TUnderlying[] GetValuesAs<TUnderlying>(type enumType)
{
return Enum.GetValues(enumType) as TUnderlying[];
}
但你必須先知道的基本類型。
謝謝!但是你仍然不能返回強類型列表的一個函數,對吧? – gdoron
這是正確的枚舉不是傳統方式的泛型類型,如果枚舉類似於'MyEnum:Enum
- 1. 枚舉列表通過C#COM互
- 2. 使用列枚舉的LINQ表枚舉
- 3. 值在枚舉列表中
- 4. C++通過枚舉
- 5. 在SQL Server表C#枚舉使用值
- 6. 枚舉值在C++
- 7. 使用枚舉()的列表
- 8. 通過訪問向枚舉值 '::' 在C++
- 9. C#:基於不同枚舉類型的枚舉值返回枚舉值
- 10. 在Obj-C中枚舉序列(使用Cocos2D中的Z值的枚舉)
- 11. 可視化C++中枚舉的列表
- 12. 在枚舉中創建枚舉列表,並且不包含值
- 13. 將多個列表枚舉值寫入另一個枚舉
- 14. 排序的枚舉列表由值
- 15. java中的枚舉值列表
- 16. 未知枚舉的列表值
- 17. 在JSON序列化枚舉值(C#)
- 18. 值枚舉的到陣列
- 19. 通過枚舉訂購列表
- 20. C#枚舉與數據驅動列表
- 21. C#列表和枚舉與性能
- 22. 枚舉值的通用數組?
- 23. 獲取枚舉值(從.dll)到列表
- 24. IEnumerable列表脫離枚舉值
- 25. 枚舉值作爲下拉列表
- 26. C#:排序/ OrderBy枚舉值
- 27. 枚舉關聯值在C
- 28. 設置空值枚舉C#
- 29. 枚舉值作爲C++
- 30. 枚舉prolog的子列表
示例輸入和輸出?即你想要輸入「SomeEnum」,還是「byte」等? –
@MarcGravell正如我寫的,我希望泛型類型是底層類型 - 字節。 – gdoron