2012-03-01 22 views
6

Tôi chỉ mới bắt đầu với Generics trong C# nhưng đã gặp sự cố sớm, làm cách nào tôi có thể gọi .HasFlag() trên số Enum chung?HasFlag có enum chung?

public class Example<TEnum> where TEnum : struct { 
} 

Làm cách nào để thêm thuộc tính [Flags] vào nó?

+0

Tóm lại, bạn không thể. Các ràng buộc không xem xét các thuộc tính trên các tham số chung. Bạn sẽ phải thực thi nó thông qua sự phản chiếu. –

+1

Các thông số loại được cho là bắt đầu bằng 'T'; bạn nên thay đổi 'GenericEnum' thành' TEnum'. – SLaks

+0

bạn có thể đưa ra ví dụ @ M.Babcock không? và lưu ý hợp lệ, @SLaks – DevDave

Trả lời

6

Gọi phương thức thể hiện cũng sẽ yêu cầu quyền anh, vì vậy, vì bạn không thể hạn chế Enum, chỉ cần từ bỏ Generics và sử dụng Enum. Ví dụ, thay vì:

void Something(TEnum enumValue, TEnum flags) 
{ 
    if (enumValue.HasFlags(flags)) 
     //do something ... 
} 

Làm điều này:

void Something(Enum enumValue, Enum flags) 
{ 
    if (enumValue.HasFlags(flags)) 
     //do something ... 
} 

Trong một phương pháp chung chung, bạn có thể đạt được mục tiêu của bạn như thế này:

void Something(TEnum enumValue, TEnum flags) 
{ 
    Enum castValue = (Enum)(object)enumValue; 
    Enum castFlags = (Enum)(object)flags; 

    if (castValue.HasFlags(castFlags)) 
     //do something ... 
} 

này sẽ ném một ngoại lệ trong thời gian chạy nếu bạn gọi phương thức với một loại giá trị không phải là một enum. Bạn cũng có thể truyền qua ValueType thay vì object, vì thông số loại được biết là đại diện cho loại giá trị:

Enum castValue = (Enum)(ValueType)enumValue; 
+0

Tôi đã làm những gì bạn đã đề xuất ban đầu, nhưng tôi đang cố gắng tái cấu trúc một số phương pháp sử dụng ví dụ của bạn thành một trong đó sẽ có một enum chung và vẫn có thể gọi có cờ trên đó – DevDave

+2

@Tyler Tôi đã thêm một ví dụ cho thấy cách bạn có thể cast một instance của một tham số kiểu generic thành 'Enum'. – phoog

+0

cảm ơn @phoog. vẫn đang cố gắng để làm việc nó ra nhưng đã nhận thấy rằng các HasFlag() phương pháp đã xuất hiện trong intellisense! – DevDave

Các vấn đề liên quan