Ketik enum di konstruktor

Jadi saya harus menginisiasi objek dari suatu kelas ke dalam bentuk utama, tetapi argumen yang harus saya masukkan ke dalam konstruktor berasal dari tipe enum yang saya buat di kelas itu.

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

^bagian ini sekarang berada di luar kelas, seperti yang disarankan.

// Constrcutors

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

Ini adalah bidang dan konstruktor untuk bidang tersebut. Di bawah ini adalah inisiasi objek kelas yang saya perlukan.

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

Jadi kelebihannya harus bertipe ThemaSoorten dan harus di enum, tetapi saat ini macet.

Adakah yang tahu cara mengatasi ini?


person Lukas    schedule 05.01.2015    source sumber
comment
BGExperience bgExperience = BGExperience baru(ThemaSoorten.thema1);   -  person Bill Dinger    schedule 05.01.2015
comment
Anda perlu mendeklarasikan enum sebagai publicdan mungkin di luar kelas.   -  person Sriram Sakthivel    schedule 05.01.2015
comment
kemungkinan duplikat Dapatkan nama nilai Enum   -  person John Alexiou    schedule 05.01.2015
comment
Anda tidak bisa menentukan nilai string untuk nilai enum seperti itu, Anda hanya bisa menentukan nilai numerik. Mengapa tidak menggunakan public enum ThemaSoorten { Muziek, Luisterboeken, Cabaretshows }; ?   -  person Lasse V. Karlsen    schedule 05.01.2015
comment
Anda tidak dapat menetapkan string ke nilai enum (setidaknya tidak ada di C# 4.0). MSDN menyatakan jenis yang disetujui untuk enum adalah byte, sbyte, short, ushort, int, uint, long, atau ulong.   -  person John Alexiou    schedule 05.01.2015


Jawaban (2)


Anda harus menjadikan enum Anda terlebih dahulu sebagai publik, lalu coba yang ini:

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

Jika Anda tidak membuat enum Anda menjadi publik, Anda tidak akan dapat mengaksesnya di luar kelas Anda apalagi untuk membuat instance kelas Anda.

Perbarui

Seperti yang telah ditunjukkan oleh Sriram dalam komentarnya, akan menjadi pendekatan desain yang lebih baik untuk tidak menjadikan enum ini menjadi tipe bersarang. Anda dapat mendeklarasikannya di luar kelas Anda, seperti:

public enum ThemaSoorten 
{ 
    Muziek, 
    Luisterboeken, 
    Cabaretshows 
}

lalu buat objek BGExperience baru seperti di bawah ini:

var bgExperience = new BGExperience(ThemaSoorten.Muziek);

Catatan Penting (terima kasih Selman22)

Anda tidak dapat mendeklarasikan enum dengan cara yang sudah Anda lakukan. Ini bahkan tidak dapat dikompilasi. Selain itu, Anda akan menerima pesan kesalahan saat mengetik ini. Bagaimanapun, cara yang benar untuk mendefinisikan enum adalah sebagai berikut:

public enum EnumName
{
    Member1,
    Member2,
    Member3
}

Di tempat EnumName Anda harus memasukkan nama enum Anda dan di tempat Member1, Member2 dan Member3 nama item di enum Anda. Jika Anda ingin item ini memiliki nilai tertentu, Anda harus melakukannya seperti:

public enum EnumName
{
    Member1 = 1,
    Member2 = 2,
    Member3 = 3
}
person Christos    schedule 05.01.2015
comment
Itu masih tidak dapat dikompilasi;) - person Sriram Sakthivel; 05.01.2015
comment
@SriramSakthivel ya, pencacahannya bersifat pribadi dan di luar cakupan - person Bill Dinger; 05.01.2015
comment
@SriramSakthivel Saya kira Anda mengatakannya, karena pengubah akses enum tidak bersifat publik. Benar? - person Christos; 05.01.2015
comment
@Christos Ya, komentar saya dibuat sebelum Anda mengedit jawabannya. Saya tetap merekomendasikan untuk membuat tipe enum non bersarang. - person Sriram Sakthivel; 05.01.2015
comment
@SriramSakthivel Terima kasih. Saya setuju dengan Anda 100%. Namun saya mencoba memberikan solusi dalam konteks OP. - person Christos; 05.01.2015
comment
bagaimana cara kompilasi ini? thema1 = "Muziek", - person Selman Genç; 05.01.2015
comment
Tidak, sintaksnya tidak valid. Anda tidak dapat menentukan nilai string untuk enum di C# atau .NET, hanya nilai numerik. - person Lasse V. Karlsen; 05.01.2015
comment
@ Selman22 Anda sepenuhnya benar. Kesalahan saya...yang tidak saya tunjukkan dan saya ulangi kesalahannya. Terima kasih telah menunjukkan hal ini. - person Christos; 05.01.2015
comment
@Christos Saya sekarang telah mendefinisikannya seperti yang Anda katakan tetapi saya masih mendapatkan kesalahan tidak dapat secara implisit mengonversi tipe 'string' menjadi 'int' - person Lukas; 05.01.2015
comment
@Lukas sudahkah Anda mendefinisikan Enum seperti dalam jawaban saya, di luar kelas Anda dan meneruskan argumen ThemaSoorten.Muziek ke konstruktor dan Anda masih mendapatkan kesalahan? Tipe yang mendasari enum adalah tipe integral. Jika kita tidak mendefinisikan secara eksplisit tipe yang mendasarinya, maka secara default tipe yang mendasari enum adalah int. Saat Anda menyetel item pertama enum menjadi Member1 nilainya adalah 0, nilai anggota berikutnya adalah 1 dan seterusnya. Di sisi lain, jika Anda meneruskan string, wajar saja jika Anda mendapatkan kesalahan ini. - person Christos; 05.01.2015
comment
@Christos ya, saya telah melakukan semuanya persis seperti jawaban Anda - person Lukas; 05.01.2015
comment
@Lukas silakan periksa dotnetfiddle.net/92opwE. Di sana saya tidak mendapatkan kesalahan apa pun. Jadi masalahnya seharusnya ada di tempat lain. - person Christos; 05.01.2015

Atau mungkin Anda ingin memberikan nilai string enum ke konstruktor, berikut cara kerjanya:

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

Pastikan untuk membuat enum menjadi publik untuk itu. Kalau tidak, Anda harus menyediakan string di konstruktor dan menguraikannya ke nilai enum di dalam konstruktor.

person Irfan    schedule 05.01.2015