我剛剛在C#中開始使用Generics
,但在早期遇到問題,如何在通用Enum
上調用.HasFlag()
?如何添加[Flags]
屬性?具有泛型枚舉的HasFlag?
6
A
回答
6
調用實例方法無論如何都需要裝箱,所以,由於您無法約束到Enum
,只需放棄泛型並使用Enum
即可。例如,而不是:
void Something(TEnum enumValue, TEnum flags)
{
if (enumValue.HasFlags(flags))
//do something ...
}
這樣做:
void Something(Enum enumValue, Enum flags)
{
if (enumValue.HasFlags(flags))
//do something ...
}
在一個通用的方法,你可以實現你的目標是這樣的:
void Something(TEnum enumValue, TEnum flags)
{
Enum castValue = (Enum)(object)enumValue;
Enum castFlags = (Enum)(object)flags;
if (castValue.HasFlags(castFlags))
//do something ...
}
這將在運行時拋出一個異常如果您使用不是枚舉的值類型調用該方法。您也可以通過ValueType
而非object
投,因爲類型參數是已知的代表值類型:
Enum castValue = (Enum)(ValueType)enumValue;
相關問題
- 1. Java的泛型枚舉
- 2. 傳遞具有泛型的枚舉的列表
- 3. 泛型和接口枚舉
- 4. Java泛型枚舉子類型接口
- 5. 從泛型類型獲取枚舉類?
- 6. 返回枚舉值的泛型函數
- 7. Java:特定枚舉和泛型枚舉<?>參數
- 8. 結合Java枚舉和泛型
- 9. 是否可以創建泛型枚舉?
- 10. 通用方法接收泛型枚舉
- 11. 模擬多態/泛型枚舉 - C#
- 12. 在枚舉中使用泛型函數
- 13. 如何用泛型實現枚舉?
- 14. 枚舉類型'枚舉'具有非文字初始值設定項的成員
- 15. 從另一個泛型枚舉初始化一個通用的Swift枚舉?
- 16. Node.js native枚舉中的枚舉類型
- 17. 具有兩種泛型的泛型類
- 18. 從rawValue初始化泛型類型的枚舉
- 19. Perl有枚舉類型嗎?
- 20. 由枚舉型
- 21. 採用Equatable協議枚舉具有嵌套枚舉值
- 22. 獲取枚舉從一類具有多個枚舉
- 23. 枚舉拋出「不是枚舉類型」
- 24. 面具枚舉[C++]
- 25. 解析一個字符串到一個泛型枚舉類型
- 26. 內部靜態枚舉爲泛型類型?
- 27. 如何約束泛型爲枚舉類型?
- 28. 具有自定義枚舉的C++類
- 29. C#具有標誌的枚舉屬性
- 30. 具有屬性和性能的枚舉
總之,你不能。約束不考慮泛型參數的屬性。你必須通過反思來強制執行。 – 2012-03-01 16:07:43
類型參數應該以'T'開頭;你應該把'GenericEnum'改爲'TEnum'。 – SLaks 2012-03-01 16:08:59
可以舉個例子@ M.Babcock?並正式指出,@SLaks – DevDave 2012-03-01 16:11:29