Kiểm tra xem đối tượng Type có phải là enum nullable trong C # hay không


83

Làm cách nào để kiểm tra xem Type có phải là enum nullable trong C # hay không

Type t = GetMyType();
bool isEnum = t.IsEnum; //Type member
bool isNullableEnum = t.IsNullableEnum(); How to implement this extension method?

Câu trả lời:


169
public static bool IsNullableEnum(this Type t)
{
    Type u = Nullable.GetUnderlyingType(t);
    return (u != null) && u.IsEnum;
}

44

CHỈNH SỬA: Tôi sẽ để lại câu trả lời này vì nó sẽ hoạt động và nó thể hiện một số lời kêu gọi mà người đọc có thể không biết. Tuy nhiên, câu trả lời của Luke chắc chắn là đẹp hơn - hãy ủng hộ nó :)

Bạn có thể làm:

public static bool IsNullableEnum(this Type t)
{
    return t.IsGenericType &&
           t.GetGenericTypeDefinition() == typeof(Nullable<>) &&
           t.GetGenericArguments()[0].IsEnum;
}

Tôi nghĩ tôi đã làm theo cách của Luke; ít phức tạp hơn cho người gọi.
Marc Gravell

2
@Marc: Tôi không thấy nó tạo ra bất kỳ tỷ lệ cược nào cho người gọi - nhưng cách của Luke chắc chắn đẹp hơn của tôi.
Jon Skeet

Vâng chắc chắn giữ nó để tham khảo trong tương lai
adrin

Vâng. Tôi đã thực hiện "public static bool IsNullableEnum (object value) {if (value == null) {return true;} Loại t = value.GetType (); return / * giống như trả về của Jon * /;}" vì nó có thể làm việc với các loại đóng hộp. Và sau đó quá tải với câu trả lời LukeH để có hiệu suất tốt hơn.
TamusJRoyce

15

Từ C # 6.0, câu trả lời được chấp nhận có thể được cấu trúc lại thành

Nullable.GetUnderlyingType(t)?.IsEnum == true

== true là cần thiết để chuyển đổi bool? để bool


1
public static bool IsNullable(this Type type)
{
    return type.IsClass
        || (type.IsGeneric && type.GetGenericTypeDefinition == typeof(Nullable<>));
}

Tôi đã bỏ qua IsEnumséc bạn đã thực hiện, vì điều đó làm cho phương pháp này tổng quát hơn.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.