ประเภท Enum ในตัวสร้าง

ดังนั้นฉันต้องเริ่มต้นวัตถุจากคลาสเป็นรูปแบบหลัก แต่อาร์กิวเมนต์ที่ฉันต้องใส่ในตัวสร้างนั้นมาจากประเภทแจงนับที่ฉันทำในคลาสนั้น

    private List<Geluidsfragment> fragmenten;
    private enum ThemaSoorten 
    { 
        Muziek, 
        Luisterboeken, 
        Cabaretshows 
    }    

^ส่วนนี้อยู่นอกชั้นเรียนแล้ว ตามคำแนะนำ

// Constrcutors

    public BGExperience(ThemaSoorten thema)
    {
        fragmenten = new List<Geluidsfragment>();
        this.thema = thema;
    }    

เหล่านี้คือฟิลด์และตัวสร้างสำหรับฟิลด์ ด้านล่างนี้คือจุดเริ่มต้นของอ็อบเจ็กต์ของคลาสนี้ที่ฉันต้องการ

public GeluidsfragmentForm()
    {
        InitializeComponent();
        BGExperience bgExperience = new BGExperience("Muziek");
    }

ดังนั้นโอเวอร์โหลดจะต้องเป็นประเภท ThemaSoorten และจะต้องอยู่ใน enum แต่เมื่อถึงจุดนี้ มันค้าง

ใครรู้วิธีการแก้ปัญหานี้?


person Lukas    schedule 05.01.2015    source แหล่งที่มา
comment
BGExperience bgExperience = BGExperience ใหม่ (ThemaSoorten.thema1);   -  person Bill Dinger    schedule 05.01.2015
comment
คุณต้องประกาศ enum เป็น publicและอาจอยู่นอกชั้นเรียน   -  person Sriram Sakthivel    schedule 05.01.2015
comment
เป็นไปได้ที่ซ้ำกันของ รับชื่อของค่า Enum   -  person John Alexiou    schedule 05.01.2015
comment
คุณไม่สามารถระบุค่าสตริงสำหรับค่าแจงนับเช่นนั้นได้ คุณสามารถระบุได้เฉพาะค่าตัวเลขเท่านั้น ทำไมไม่ใช้ public enum ThemaSoorten { Muziek, Luisterboeken, Cabaretshows }; ?   -  person Lasse V. Karlsen    schedule 05.01.2015
comment
คุณไม่สามารถกำหนดสตริงให้กับค่า enum ได้ (อย่างน้อยก็ไม่ใช่ใน C# 4.0) MSDN ระบุประเภทที่ได้รับการอนุมัติ สำหรับ enum ได้แก่ byte, sbyte, short, ushort, int, uint, long หรือ ulong   -  person John Alexiou    schedule 05.01.2015


คำตอบ (2)


คุณควรทำให้ enum ของคุณเป็นแบบสาธารณะก่อน จากนั้นลองทำสิ่งนี้:

BGExperience bgExperience = new BGExperience(BGExperience.ThemaSoorten.Muziek);

หากคุณไม่ทำให้ enum ของคุณเป็นแบบสาธารณะ คุณจะไม่สามารถเข้าถึงได้นอกชั้นเรียน ไม่ต้องพูดถึงการสร้างอินสแตนซ์ของชั้นเรียนของคุณ

อัปเดต

ตามที่ Sriram ได้ชี้ให้เห็นอย่างถูกต้องแล้วในความคิดเห็นของเขา มันจะเป็นวิธีการออกแบบที่ดีกว่าที่จะไม่ทำให้ enum นี้เป็นแบบซ้อนกัน คุณสามารถประกาศนอกชั้นเรียนได้ เช่น:

public enum ThemaSoorten 
{ 
    Muziek, 
    Luisterboeken, 
    Cabaretshows 
}

จากนั้นสร้างวัตถุ BGExperience ใหม่ดังนี้:

var bgExperience = new BGExperience(ThemaSoorten.Muziek);

หมายเหตุสำคัญ (ขอบคุณ Selman22)

คุณไม่สามารถประกาศ enum ด้วยวิธีที่คุณทำไปแล้วได้ สิ่งนี้ไม่สามารถรวบรวมได้ นอกจากนี้ คุณควรรับข้อความแสดงข้อผิดพลาดในขณะที่พิมพ์ข้อความนี้ อย่างไรก็ตาม วิธีที่ถูกต้องในการนิยาม enum มีดังต่อไปนี้:

public enum EnumName
{
    Member1,
    Member2,
    Member3
}

แทนที่ EnumName คุณควรใส่ชื่อ enum ของคุณ และแทนที่ Member1, Member2 และ Member3 ชื่อของรายการในการแจงนับของคุณ หากคุณต้องการให้รายการนี้มีค่าเฉพาะ คุณควรดำเนินการดังนี้:

public enum EnumName
{
    Member1 = 1,
    Member2 = 2,
    Member3 = 3
}
person Christos    schedule 05.01.2015
comment
ที่ยังคงไม่รวบรวม;) - person Sriram Sakthivel; 05.01.2015
comment
@SriramSakthivel ใช่แล้วการแจงนับเป็นแบบส่วนตัวและไม่อยู่ในขอบเขต - person Bill Dinger; 05.01.2015
comment
@SriramSakthivel ฉันคิดว่าคุณกำลังพูดเช่นนั้นเพราะตัวแก้ไขการเข้าถึง enum ไม่ได้เปิดเผยต่อสาธารณะ ถูกต้อง? - person Christos; 05.01.2015
comment
@Christos ใช่ ความคิดเห็นของฉันถูกสร้างขึ้นก่อนที่คุณจะแก้ไขคำตอบ ฉันยังคงแนะนำให้สร้าง enum ที่ไม่ซ้อนกัน - person Sriram Sakthivel; 05.01.2015
comment
@SriramSakthivel ขอบคุณครับ ฉันเห็นด้วยกับคุณ 100% อย่างไรก็ตามฉันพยายามให้วิธีแก้ปัญหาในบริบทของ OP - person Christos; 05.01.2015
comment
คอมไพล์นี้เป็นอย่างไร? thema1 = "Muziek", - person Selman Genç; 05.01.2015
comment
มันไม่เป็นเช่นนั้น มันเป็นไวยากรณ์ที่ไม่ถูกต้อง คุณไม่สามารถระบุค่า string สำหรับแจงนับใน C# หรือ .NET ได้ แต่จะระบุเฉพาะค่าตัวเลขเท่านั้น - person Lasse V. Karlsen; 05.01.2015
comment
@ Selman22 คุณถูกต้องสมบูรณ์ ความผิดพลาดของฉัน...ที่ฉันไม่ได้ชี้ให้เห็นและทำซ้ำข้อผิดพลาดนั้น ขอบคุณสำหรับการชี้ให้เห็นสิ่งนี้ - person Christos; 05.01.2015
comment
@Christos ตอนนี้ฉันได้กำหนดมันตามที่คุณพูดแล้ว แต่ฉันยังคงได้รับข้อผิดพลาดไม่สามารถแปลงประเภท 'string' เป็น 'int' โดยปริยาย - person Lukas; 05.01.2015
comment
@Lukas คุณได้กำหนด Enum like ในคำตอบของฉันนอกชั้นเรียนของคุณและส่งอาร์กิวเมนต์ ThemaSoorten.Muziek ไปยัง Constructor แล้วคุณยังได้รับข้อผิดพลาดหรือไม่? ประเภทพื้นฐานของแจงนับคือประเภทอินทิกรัล เมื่อเราไม่ได้กำหนดประเภทที่สำคัญไว้อย่างชัดเจน ตามค่าเริ่มต้น ประเภทพื้นฐานของ enum จะเป็น int เมื่อคุณตั้งค่ารายการแรกของแจงนับให้เป็น Member1 ค่าจะเป็น 0 ค่าของสมาชิกถัดไปจะเป็น 1 และต่อๆ ไป ในทางกลับกัน หากคุณส่งผ่านสตริง ก็สมเหตุสมผลที่คุณจะได้รับข้อผิดพลาดนี้ - person Christos; 05.01.2015
comment
@Christos ใช่ฉันได้ทำทุกอย่างเหมือนในคำตอบของคุณแล้ว - person Lukas; 05.01.2015
comment
@Lukas โปรดตรวจสอบ dotnetfiddle.net/92opwE นี้ ที่นั่นฉันไม่ได้รับข้อผิดพลาดใด ๆ ดังนั้นปัญหาควรอยู่ที่อื่น - person Christos; 05.01.2015

หรือบางทีคุณอาจต้องการระบุค่าสตริงของ enum ให้กับ Constructor ต่อไปนี้คือวิธีการทำงาน:

BGExperience bgExperience = new BGExperience((BGExperience.ThemaSoorten)Enum.Parse(typeof(BGExperience.ThemaSoorten), "Muziek"));

อย่าลืมเปิดเผย enum ให้เป็นสาธารณะสำหรับสิ่งนั้น มิฉะนั้นคุณจะต้องจัดเตรียมสตริงในตัวสร้างและแยกวิเคราะห์เป็นค่าแจงนับภายในตัวสร้าง

person Irfan    schedule 05.01.2015