2015-11-12 2 views
0

первый вопрос о S.O, и все вокруг новичка на данный момент.Инициализация класса с помощью конструктора с iList <T>?

Я пытаюсь создать Json-файл из объекта прямо сейчас для игры. Это главный объект, который я хочу, чтобы записать в файл: (классы «блок», и «элементы» являются iLists, как вы можете, вероятно, сказать)

public string title { get; set; } 
    public string type { get; set; } 
    public string map { get; set; } 
    public string mode { get; set; } 
    public string champion { get; set; } 
    public int sortrank { get; set; } 
    public bool isGlobalForChampions { get; set; } 
    public bool isGlobalForMaps { get; set; } 
    public bool priority { get; set; } 
    public IList<Block> blocks { get; set; } 
    public IList<object> associatedChampions { get; set; } 
    public IList<object> associatedMaps { get; set; } 

    public ItemSet(string _title, string _type, string _map, string _mode, string _champion, int _sortrank, bool _isGlobalForChampions, bool _isGlobalForMaps, bool _priority, IList<Block> _blocks, IList<object> _associatedChampions, IList<object> _associatedMaps) 
    { 
     title = _title; 
     type = _type; 
     map = _map; 
     mode = _mode; 
     champion = _champion; 
     sortrank = _sortrank; 
     isGlobalForChampions = _isGlobalForChampions; 
     isGlobalForMaps = _isGlobalForMaps; 
     priority = _priority; 
     blocks = _blocks; 
     associatedChampions = _associatedChampions; 
     associatedMaps = _associatedMaps; 
    } 

public class Block 
{ 
    public IList<Item> items { get; set; } 
    public string type { get; set; } 
} 

public class Item 
{ 
    public int count { get; set; } 
    public string id { get; set; } 
} 

Но я получаю отчетливое чувство, что я нахожусь обо всем этом не так. Я фактически использовал генератор Json для C#, чтобы обнаружить (после многих неудачных попыток вручную) дать мне представление о переменных переменных, которые мне, возможно, потребуется рассмотреть. Но я не могу для жизни понять, что синтаксис для инициализации iList <> с конструктором, и никакое количество плохой googling не приближает меня к этому ответу.

Текущий intialization: (отсутствующий последних 3-х аргументов, очевидно)

ItemSet itemSetTest = new ItemSet("TEST_ITEM_SET", "custom", "any", "", "Kalista", 0, false, true, false,); 

Если я не предоставил достаточно/право информации, пожалуйста, не стесняйтесь быть тупым!

Боковые вещи: Предполагаю, что я буду добавлять в списки, как и с любым другим массивом? Действительно ли это ужасный способ сделать это?

+1

'IList ' это интерфейс, используйте 'List ', такие как 'IList блоков = новый список ()' –

+0

См [Object и Инициализаторы коллекции в C#] (https://msdn.microsoft.com/en-us/library/bb384062.aspx) –

ответ

1

удалите конструктор, который у вас есть, он вам не нужен.

itemSet = new ItemSet { 
    title="...", 
    ..., 
    blocks=new List<Blocks>() { 
    new Block { 
     type="...", 
     items=new List<Item>() { 
     new Item { count=..., id=...}, 
     new Item { count=..., id=...} 
     } 
    }, 
    new Block { 
     type="...", 
     items=new List<Item>() { 
     new Item { count=..., id=...}, 
     new Item { count=..., id=...} 
     } 
    } 
    } 
}; 
+0

Новый IList? Возможно ли это? items = new IList {... –

+0

Глупо меня. Обновлено. –

+0

Я думал, что конструктор должен сохранить инициализацию на одной строке, мне нравится, насколько она чистая. И благодарю вас! –

0

Это путь -

new List<Item>() { 
      new Item(), 
      new Item(), 
      new Item(), 
      new Item() 
    }; 

Успехов

0

Чтобы ответить на ваш вопрос о том, как создать экземпляр класса; вам нужно будет передать новые элементы списка вашему конструктору. Например:

//add items to these lists and change names if needs be. 
var blocks = new List<Block>(); 
var champs = new List<Object>(); 
var maps = new List<Object>(); 

var itemSetTest = new ItemSet("TEST_ITEM_SET", "custom", "any", "", "Kalista", 0, false, true, false, blocks, champs, maps); 

По существу, List реализует IList. IList - это интерфейс и как таковой не может быть создан. Но поскольку List реализует IList, вы можете передать список через свой конструктор, и он примет его.

Надеюсь, что ответит на ваш вопрос.

Я также хочу упомянуть, что ваш конструктор невероятно большой (о матроне). Возможно, вам стоит подумать о создании еще нескольких классов и объединении этих свойств. Вы также можете использовать значения по умолчанию для некоторых из этих свойств; например, если чемпион строк обычно «bob», вы можете установить это как значение по умолчанию и только передать строку чемпиона в конструкторе, когда имя отличается.

Я также предполагаю, что ваш класс ItemSet (возможно, думает о более значимом имени) на самом деле является классом, и вы просто скопировали часть блока кода обертывания?


Update 1

Когда вы говорите, чтобы объединить свойства, вы имеете в виду использовать наследство?

Не совсем, но, возможно, я не сказал об этом должным образом. Я имею в виду группировку связанных свойств в свои собственные классы. Давайте рассмотрим простой пример или класс Person:

public class Person 
    { 
     public string Name { get; set; } 
     public string Postcode { get; set; } 
     public string Town { get; set; } 
     public string Country { get; set; } 
     public string TwitterUrl { get; set; } 
     public string FacebookUrl { get; set; } 
     public string GooglePlusUrl { get; set; } 

     public Person(string name, string postcode, string town, string country, string twitterurl, string facebookurl, string googleplusurl) 
     { 
      Name = name; 
      Postcode = postcode; 
      Town = town; 
      Country = country; 
      TwitterUrl = twitterurl; 
      FacebookUrl = facebookurl; 
      GooglePlusUrl = googleplusurl; 
     } 
    } 

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

var person = new Person("Some name", "some postcode", "some town", "some country", "some twitter url", "some fb url", "some g+ url"); 

Позволяет упростить его группируя соответствующие свойства в их собственных классах:

public class Person 
    { 
     public string Name { get; set; } 
     public Address Address { get; set; } 
     public SocialMedia SocialMedia { get; set; } 

     public Person(string name, Address address, SocialMedia socialmedia) 
     { 
      Name = name; 
      Address = address; 
      SocialMedia = socialmedia; 
     } 
    } 

    public class Address 
    { 
     public string Postcode { get; set; } 
     public string Town { get; set; } 
     public string Country { get; set; } 
    } 

    public class SocialMedia 
    { 
     public string TwitterUrl { get; set; } 
     public string FacebookUrl { get; set; } 
     public string GooglePlusUrl { get; set; } 
    } 

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

var address = new Address() { ... }; 
var socialmedia = new SocialMedia() { ... }; 
var person = new Person("Some name", address, socialmedia); 

Для меня это более читаемым. Ваш адрес & Модели SocialMedia могут быть повторно использованы в другом месте приложения.

Я пытался понять, как сериализовать несколько объектов (json.net) в тот же файл без каких-либо удачи в течение примерно недели, и было решили просто попробовать, чтобы держать все в одном классе.

json.net от Newtonsoft (http://www.newtonsoft.com/json)? Если нет, то я рекомендую вам использовать эту библиотеку, поскольку она стала стандартной.

сериализовать наш объявил person вам нужно будет использовать следующий метод, предоставленный Json.NET:

//... 
var person = new Person("Some name", address, socialmedia); 
string personJsonified = JsonConvert.SerializeObject(person); 

Это создаст JSon строку нашего человека.

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

var person1 = new Person("Jim", address, socialmedia); 
    var person2 = new Person("Bob", address, socialmedia); 
    var people = new List<Person> { person1, person2 }; 

    string peopleJsonified = JsonConvert.SerializeObject(people); 

Если вы хотите использовать несколько типов, которые будут возвращены в JSon строки, такие как Человек и автомобиль (вымышленный класс мы создали), вам нужно будет обернуть их в каком-нибудь другом классе:

  var myPerson = new Person("Jim", address, socialmedia); 
      var myCar = new Car(); 
      var randomObjects = new SomeRandomObjects{ Person = myPerson, Car = myCar }; 

      string randomObjectsJsonified = JsonConvert.SerializeObject(randomObjects); 

Надеется, вы получите вы сможете получить файл JSon сгенерированный из этого.

Также есть советы по назначению именования?

Что касается соглашения об именах и СНИМИТЕ, проверить MSDN Design Guidelines for Developing Class Libraries

+0

Когда вы говорите, чтобы объединить свойства, вы хотите использовать наследование? Я пытался понять, как сериализовать несколько объектов (json.net) в один и тот же файл без какой-либо удачи в течение недели, и решил просто попытаться сохранить все в одном классе. Подумав о правильном вопросе с просьбой об этикете, я понимаю, что я позволил другой проблеме вызвать в какой-то степени абстрактный вопрос, и для этого я извиняюсь. Также есть советы по назначению именования? –

+0

Честно говоря, я включил в этот класс больше свойств, чем я изначально планировал, а на самом деле многие не будут использоваться очень часто, если вообще. Поэтому после того, как я решила свою проблему, я удалю некоторые из них и, надеюсь, узнаю, как сериализовать более одного объекта в один файл. –

+0

@ConorMacF Я обновил ответ с ответами на ваш вопрос в комментариях. Надеюсь, это поможет. Я бы сосредоточился на том, чтобы он работал первым, затем возвращался к нему и рефакторировал. Похоже, что у вас уже есть большая часть кода, так что вы почти там. –

Смежные вопросы