ตรวจสอบว่าประเภทที่ระบุเป็น Enum หรือไม่


117

ฉันกำลังเขียน JsonConverter สำหรับ Json.NET ซึ่งควรอนุญาตให้ฉันแปลง enum ใด ๆ เป็นค่าสตริงที่กำหนดโดยแอตทริบิวต์ [Description]

ตัวอย่างเช่น:

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

ฉันมีรหัสสำหรับรองรับอยู่แล้วmyEnum.Description()ซึ่งจะส่งคืนคำอธิบายสตริงอย่างชัดเจน

ในการใช้งาน JsonConverter มีวิธีนี้:

    public override bool CanConvert(Type objectType)
    {

    }

ฉันกำลังพยายามหาวิธีตรวจสอบว่าobjectTypeเป็นEnumและส่งคืนจริงหรือไม่เพื่อให้ตัวแปลงรู้ว่าสามารถแปลงวัตถุนี้ได้ เนื่องจากฉันมีหลายตัวEnumฉันจึงไม่สามารถตรวจสอบแต่ละอันได้อย่างชัดเจนดังนั้นฉันจึงหวังว่าจะมีวิธีการทั่วไปในการบรรลุเป้าหมายนี้มากขึ้น


เมื่อคุณพูดว่า "กำหนดว่า objectType เป็น Enum" โดยพื้นฐานแล้วคุณต้องการตรวจสอบว่า objectType เป็น "MyEnum" ไม่ใช่แค่ enum อื่น ๆ ถูกต้องหรือไม่
Pawan Mishra

ไม่ฉันต้องการตรวจสอบว่าเป็น Enum หรือไม่ คำตอบของ @ minitech คือสิ่งที่ฉันกำลังมองหา
Bryan Migliorisi

คำตอบ:


234

ใช้IsEnumคุณสมบัติ:

if(objectType.IsEnum) {
    return true;
}

62
หรือเพียงแค่return objectType.IsEnum
Andrew Whitaker

7
@AndrewWhitaker: ฉันคิดว่าตั้งแต่มีการเรียกวิธีนี้CanConvertมันจะตรวจสอบการแปลงที่เป็นไปได้หลาย ๆ รายการไม่ใช่แค่ว่าเป็นenumไฟล์. มิฉะนั้นคุณอาจใช้IsEnumทรัพย์สินของตัวเองได้เช่นกัน
Ry-

5
@BryanMigliorisi: ยินดีต้อนรับคุณมาก :) อย่าลืมเรียกดู IntelliSense เสมอฉันได้เรียนรู้มากมายจากมัน
Ry-

9
@SergeyMetlov ใน PCL คุณสามารถใช้ objectType.GetTypeInfo () ได้ IsEnum
Alexander Müller

การแข่งขันเป็นอย่างไรถ้า (myObject is Enum)
Nick Kovalsky


1

ฉันตีความคำถามผิดอย่างสิ้นเชิงโดยเน้นที่ [Description] มากเกินไปดังนั้นในกรณีที่คุณต้องการตรวจสอบว่า enum นั้นมีแอตทริบิวต์ [description] หรือไม่ (ในกรณีที่ json พ่นพอดีเมื่อไม่มี) นี่คือ วิธีหนึ่งที่เป็นไปได้ในการตรวจสอบสิ่งนั้น:

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;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.