Periksa apakah Jenis yang diberikan adalah Enum

117

Saya menulis JsonConverter untuk Json.NET yang memungkinkan saya untuk mengubah enum apapun menjadi nilai string yang ditentukan oleh atribut [Description].

Sebagai contoh:

public enum MyEnum {
    [Description("Sunday")] Sunday,
    [Description("Monday")] Monday,
    [Description("Tuesday")] Tuesday,
    [Description("Wednesday")] Wednesday,
    [Description("Thursday")] Thursday,
    [Description("Friday")] Friday,
    [Description("Saturday")] Saturday
}

Saya sudah memiliki kode untuk mendukung myEnum.Description()yang jelas akan mengembalikan deskripsi stringnya.

Dalam implementasi JsonConverter, ada metode ini:

    public override bool CanConvert(Type objectType)
    {

    }

Saya mencoba mencari cara untuk menentukan apakah objectTypean Enumdan mengembalikan true sehingga konverter tahu itu dapat mengonversi objek ini. Karena saya punya banyak Enum, saya tidak bisa secara eksplisit memeriksa masing-masing jadi saya berharap cara yang lebih umum untuk mencapai ini.

Bryan Migliorisi
sumber
Saat Anda mengatakan "tentukan apakah objectType adalah Enum", pada dasarnya Anda ingin memeriksa apakah objectType adalah "MyEnum", bukan sembarang enum lainnya. Apakah itu benar?
Pawan Mishra
Tidak, saya ingin memeriksa apakah itu Enum. Jawaban @ minitech adalah apa yang saya cari.
Bryan Migliorisi

Jawaban:

234

Gunakan IsEnumproperti:

if(objectType.IsEnum) {
    return true;
}
Ry-
sumber
62
atau hanyareturn objectType.IsEnum
Andrew Whitaker
7
@AndrewWhitaker: Saya pikir karena metode ini dipanggil CanConvert, ia akan memeriksa beberapa kemungkinan konversi yang berbeda, tidak hanya jika itu sebuah enum. Jika tidak, Anda mungkin juga hanya menggunakanIsEnum properti itu sendiri.
Ry-
5
@BryanMigliorisi: Sama-sama :) Pastikan untuk selalu menelusuri IntelliSense, saya telah belajar banyak darinya.
Ry-
9
@SergeyMetlov di PCL Anda dapat menggunakan objectType.GetTypeInfo (). IsEnum
Alexander Müller
bagaimana jika (myObject adalah Enum)
Nick Kovalsky
19

Type.IsEnum adalah apa yang Anda cari

parapura rajkumar
sumber
1

Saya benar-benar salah menafsirkan pertanyaan dengan berfokus terlalu banyak pada [Description], jadi jika Anda ingin memeriksa apakah enum tertentu memiliki atribut [description] atau tidak (jika json memberikan kecocokan ketika tidak ada), ini adalah satu cara yang mungkin untuk memeriksanya:

public override bool CanConvert(Type objectType)
{
    FieldInfo[] fieldInfo = objectType.GetFields(BindingFlags.Public | BindingFlags.Static);

    if( fieldInfo.Length > 0 )
    {
        return ( fieldInfo[0].GetCustomAttributes(typeof(DescriptionAttribute),false).Length > 0 );
    }
    else
    {
        return false;
    }
}
Tom
sumber