Как добавить перечислимые значения в список - PullRequest
13 голосов
/ 31 мая 2010

У меня есть следующее перечисление:

public enum SymbolWejsciowy
{
     K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 
}

Я хочу создать список, используя значения этого перечисления:

 public List<SymbolWejsciowy> symbol;

Я пробовал несколько разных способов добавить значения enum в список:

SymbolWejsciowy symbol;  
symbol.Add(symbol = SymbolWejsciowy.K1); 

и

symbol.Add(SymbolWejsciowy.K1); 

Однако я всегда получаю следующее исключение:

Ссылка на объект не установлена ​​для экземпляра объекта.

Как мне правильно это сделать?

Ответы [ 4 ]

17 голосов
/ 31 мая 2010

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

Обратите внимание, что если вы хотите создать новый список, вы можете использовать более краткий синтаксис инициализатора коллекции :

List<SymbolWejsciowy> symbols = new List<SymbolWejsciowy> 
{
    SymbolWejsciowy.K1,
    SymbolWejsciowy.K2,
    // ...
};

Если вам нужен список, содержащий все значения, вы можете получить его, вызвав Enum.GetValues:

List<SymbolWejsciowy> symbols = Enum.GetValues(typeof(SymbolWejsciowy))
                                    .Cast<SymbolWejsciowy>()
                                    .ToList();
3 голосов
/ 31 мая 2010

В вашем варианте 1 экземпляр SymbolWejsciowy и ваш список имеют одно и то же имя, я думаю, это ошибка опечатки.

Без учета этого я бы сказал, что вы не создали экземпляр списка

symbol = new List<SymbolWejsciowy>();
2 голосов
/ 31 мая 2010

Ваш код никогда не инициализирует список.Попробуйте это:

public List<SymbolWejsciowy> symbol = new List<SymbolWejsciowy>();
symbol.Add(SymbolWejsciowy.K1);

и

SymbolWejsciowy mySymbol= SymbolWejsciowy.K2;
symbol.Add(mySymbol);
0 голосов
/ 31 мая 2010

Было бы неплохо, если бы Enum.GetValues() было обновлено для дженериков еще в C # 2.0. Ну, думаю, мы должны написать это сами:

static class EnumHelpers<T> where T : struct
{
    public class NotAnEnumException : Exception
    {
        public NotAnEnumException() : base(string.Format(@"Type ""{0}"" is not an Enum type.", typeof(T))) { }
    }

    static EnumHelpers()
    {
        if (typeof(T).BaseType != typeof(Enum)) throw new NotAnEnumException();
    }

    public static IEnumerable<T> GetValues()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }

    public static T Parse(string value)
    {
        return (T)Enum.Parse(typeof(T), value);
    }
}

Я включил Parse(), потому что он также использует дженерики.

Использование:

        var symbols = EnumHelpers<SymbolWejsciowy>.GetValues().ToList();

        SymbolWejsciowy s = EnumHelpers<SymbolWejsciowy>.Parse("S2");

(ВНЕ: Я также хотел бы, чтобы вы написали where T : enum только для такого рода вещей. Также, where T : delegate.)

...