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;
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. –
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
bạn có thể đưa ra ví dụ @ M.Babcock không? và lưu ý hợp lệ, @SLaks – DevDave