Тип перечисления в конструкторе

Итак, я должен инициировать объект из класса в основную форму, но аргументы, которые я должен поместить в конструктор, относятся к типу перечисления, который я создал в этом классе.

    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 и должна быть в перечислении, но на этом этапе она зависает.

Кто-нибудь знает, как это решить?


person Lukas    schedule 05.01.2015    source источник
comment
BGExperience bgExperience = новый BGExperience(ThemaSoorten.thema1);   -  person Bill Dinger    schedule 05.01.2015
comment
Вам нужно объявить перечисление как 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 указывает одобренные типы для перечисления: 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 общедоступным, вы не сможете получить к нему доступ за пределами вашего класса, не говоря уже о создании экземпляра вашего класса.

Обновить

Как правильно Шрирам уже указал в своих комментариях, было бы лучшим подходом к дизайну не делать этот 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%. Однако я попытался дать решение в контексте ОП. - 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
@ Лукас, ты определил Enum, как в моем ответе, вне своего класса и передал аргумент ThemaSoorten.Muziek конструктору, и все равно получаешь ошибку? Базовый тип перечисления является интегральным типом. Если мы не определяем явно базовый тип, то по умолчанию базовым типом перечисления является 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

Или, возможно, вы хотите предоставить конструктору строковое значение перечисления, тогда вот как это будет работать:

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

Обязательно сделайте для этого перечисление общедоступным. В противном случае вы должны предоставить строку в конструкторе и проанализировать ее значение перечисления в конструкторе.

person Irfan    schedule 05.01.2015