Tôi đang cố gắng tạo một phương thức trợ giúp để liệt kê tên của tất cả các bit được đặt trong một giá trị Enum (cho mục đích ghi nhật ký). Tôi muốn có một phương thức sẽ trả về danh sách tất cả các giá trị Enum được đặt trong một số biến. Trong ví dụ của tôiLiệt kê tất cả các tên bit từ một lá cờ Enum
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
Tôi nuôi nó 0x81, và nó sẽ cung cấp cho tôi với một IEnumerable<HWResponse>
chứa {Ready, Error}
.
Vì tôi không tìm thấy một cách đơn giản hơn, tôi đã cố gắng viết mã bên dưới, nhưng tôi không thể biên dịch được.
public static IEnumerable<T> MaskToList<T>(Enum mask)
{
if (typeof(T).IsSubclassOf(typeof(Enum)) == false)
throw new ArgumentException();
List<T> toreturn = new List<T>(100);
foreach(T curValueBit in Enum.GetValues(typeof (T)).Cast<T>())
{
Enum bit = ((Enum) curValueBit); // Here is the error
if (mask.HasFlag(bit))
toreturn.Add(curValueBit);
}
return toreturn;
}
Trên phiên bản mã này, trình biên dịch phàn nàn rằng nó không thể truyền T đến Enum.
Tôi đã làm gì sai? Có cách nào tốt hơn (đơn giản hơn) để làm điều này? Làm thế nào tôi có thể làm cho các diễn viên?
Ngoài ra, tôi đã cố gắng để viết phương pháp như
public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
nhưng Enum là một loại đặc biệt mà cấm cú pháp 'nơi' (Sử dụng C# 4.0)
Điều này dường như không phải là một lá cờ; các kết hợp không có ý nghĩa. Có thể một cái gì đó được "làm việc" và "Ready" cùng một lúc? –
@DBM: Điều này đúng, nó chỉ là một ví dụ ngớ ngẩn – PPC
@All: Cảm ơn bạn đã có câu trả lời tuyệt vời của bạn. Tất cả 3 đều hữu ích! – PPC