Добавление элементов в IEnumerable <T>при создании нового объекта класса - PullRequest
0 голосов
/ 06 июля 2018

У меня есть класс, который я заполняю с целью сериализации в JSON

В моем классе есть строки и один IEnumerable второго класса (Icons)

public class ManifestModel
    {
        public string ShortName { get; set; }

        public string Name { get; set; }

        public IEnumerable<Icon> Icons { get; set; }

        public string BackgroundColour { get; set; }

        public string ThemeColour { get; set; }

        public class Icon
        {
            public string Src { get; set; }

            public string Type { get; set; }

            public string Sizes { get; set; }
        }
    }

При создании экземпляра ManifestModel заполнить свойства строки достаточно просто, но как мне добавить две переменные-иконки (icon192 и icon512)?

 var icon192 = new ManifestModel.Icon
            {
                Src = "192",
                Type = "images/png",
                Sizes = "192x192"
            };

 var icon512 = new ManifestModel.Icon
            {
                Src = "512",
                Type = "images/png",
                Sizes = "512x512"
            };

            var manifestModel = new ManifestModel
            {
                ShortName = siteRoot.GetValue<string>("siteTitle"),
                Name = siteRoot.GetValue<string>("siteName"),
                //how to add two Icon objects here
            };

Я пытался

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Поскольку Icons является IEnumerable, вы можете создать список

var manifestModel = new ManifestModel
        {
            Icons = new List<ManifestModel.Icon>() { icon192, icon512 },    
            //do something 
0 голосов
/ 06 июля 2018

Редко использовать свойство чтения / записи для ведения списка элементов в объекте. То, что вы обычно хотите, это решение, где вы можете просто написать:

foreach (Icon icon in model.Icons) {
    //Do something
}

Со свойством чтения / записи Icons может быть null, а результатом будет NullReferenceException.

Что еще хуже, это то, что вы добавите потенциал для тонких ошибок Когда вы начинаете итерацию по Icons и устанавливаете значение во время итерации, вы можете ожидать, что продолжите итерацию по новому списку. Это не тот случай, вы продолжаете повторять предыдущее значение. Обычно в этих случаях исходная итерация должна завершиться с InvalidOperationException при продолжении.

Чтобы избежать этой проблемы, используйте коллекцию, производную от System.Collections.ObjectModel.Collection<T>, и представьте ее как свойство:

public class IconCollection : Collection<Icon> {
    //Customize here
}

public class ManifestModel
{
    //
    public IconCollection Icons { get; } = new IconCollection();
    //...
}

Когда вы хотите добавить предметы, вы идете:

model.Icons.Add(icon);

Это позволит избежать проблем, описанных выше.

0 голосов
/ 06 июля 2018

Просто создайте массив и присвойте свойству Icons.

var manifestModel = new ManifestModel
{    
    Icons  = new[] { icon192, icon512 },
    //...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...