Ошибка времени выполнения при попытке добавить элемент в список свойств в классе в C# - PullRequest
0 голосов
/ 22 января 2020

У меня есть класс со свойством, представляющим собой список enum значений, которые должны быть заполнены во время выполнения (я использую список вместо массива, потому что я заранее не знаю, сколько будет элементов).

Я объявил свойство следующим образом:

public class Entity 
{
    // ...
    public List<FooEnum> FooList { get; set; }
    // ... 
}

, где FooEnum имеет следующую структуру:

public enum FooEnum
{

    [Description( "Foo: " )]
    Foo = 1,

    [Description( "Boo: " )]
    Boo = 3,

    [Description( "Loo: " )]
    Loo,

    //...
}

Чтобы добавить элементы в список, я добавил следующее метод класса Entity:

public void SetFoos( string packet )
{
    VectorSize = short.Parse( ExtractValue( packet, "ListSize: " ) );

    for( int i = 0, start = packetIndexOf( "ListSize" ); i < VectorSize; i++ )
    {
        string reducedPacket = packet.Substring( start );
        string currentFoo = ExtractValue( packet, "--------------\r\n" );

        foreach( FooEnum foo in FooEnum.GetValues( typeof( FooEnum ) ) )
        {
            if( foo.Description().StartsWith( currentFoo ) ) { FooList.Add(foo); break; }
        }
    }
}

Я еще не реализовал логи запуска обновления c, потому что хотел протестировать пример, где VectorSize был 1, но при запуске программы я получил ошибку времени выполнения :

System.NullReferenceException: ссылка на объект не определена для экземпляра объекта

Я попытался объявить список как public List<FooEnum> FooList = new List<FooEnum>();, но сразу же получил предупреждение о том, что

Поле "Entity.FooList" никогда не атрибутируется и всегда будет иметь нулевое значение по умолчанию

, поэтому я вернулся к использованию геттера и сеттера.

Я попытался найти несколько примеров свойств List в C# и на их основе я попытался изменить свое объявление на

public class Entity 
{
    // ...
    private List<FooEnum> fooList;
    public List<FooEnum> FooList 
    {
        get { return fooList; } 
        set { fooList = value; } 
    }
    // ... 
}

, но получил ту же ошибку времени выполнения.

Чего мне не хватает? Разве нельзя использовать список Enums в качестве свойства класса?

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Добавьте конструктор в класс Entity и инициализируйте FooList или foolist, как показано ниже

public class Entity 
{
    public List<FooEnum> FooList { get; set; }

    // ctor 
    public Entity()
    {
        FooList = new List<FooEnum>();
    }
}
1 голос
/ 22 января 2020

Вам нужно инициализировать свой fooList перед добавлением foo, как показано ниже:

    fooList = new List<FooEnum>();
...