使用 iList 的构造函数初始化类<T>?



关于S.O的第一个问题,以及目前的新手。

我现在正试图为一个游戏从一个对象创建一个Json文件。这是我要写入文件的主要对象:(类"块"one_answers"项目"是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<>的语法有了构造函数,再多糟糕的谷歌搜索也不会让我更接近这个答案。

当前初始化:(显然缺少最后3个参数)

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

如果我没有提供足够/正确的信息,请不要犹豫,直言不讳!

次要事项:我想我会像添加其他数组一样添加到列表中吗?这样做是不是很糟糕?

删除您拥有的构造函数,您不需要它。

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=...}
      }
    }
  }
};

这就是前进的道路-

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

祝好运

回答您关于如何实例化类的问题;您需要将新的List项传递给构造函数。例如:

//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,所以您可以将List传递给构造函数,它就会接受它

我希望这能回答你的问题。

我还想提一下,你的构造函数非常大(哦,matron)。您可能需要考虑创建更多的类并组合这些属性。您还可以考虑为其中一些属性设置默认值;例如,如果字符串冠军通常是"bob",则可以将其设置为默认值,并且只有在名称不同时才将冠军字符串传递给构造函数。

我还假设您的ItemSet类(也许想一个更有意义的名称)实际上是一个类,而您只是复制了一些包装代码块?


更新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; }
    }

现在我们的Person只有属性,你可以立即看到发生了什么。我们已经将构造函数的大小减少到一个更易于管理的状态:

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

对我来说,这更可读。您的地址&SocialMedia模型也可以在应用程序的其他地方重复使用。

我一直在想如何序列化多个对象(json.net)转移到同一个文件,但在大约一周的时间里没有任何运气,并且决定尽量把所有的东西都放在一个班里。

Newtonsoft的json.net(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字符串中返回多个类型,例如Person和Car(我们创建的一个虚构类),则需要将它们封装在其他类中:

            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开发类库的设计指南

相关内容

  • 没有找到相关文章

最新更新