none
Динамическое создание массива типа одного из объектов, передаваемого методу в качестве параметра в C# RRS feed

  • Вопрос

  • class bishop:unit {} class knight:unit {} class peasant:unit {} void Battle(unit first, unit second, byte firstAmount, byte secondAmount) { }


    В качестве параметров в метод Battle передаются экземпляры классов knight, bishop и etc, являющиеся потомками

    unit, как определить какого именно типа является экземпляр и создать ему соответствующий массив?

    Я пробовал через System.Array.CreateInstance(first.GetType(),firstAmount);, но это не очень удобно в обращении



    • Изменено Shirogatsu 2 сентября 2013 г. 21:18
    2 сентября 2013 г. 21:18

Ответы

  • Если у вас метод передаются в качестве First и Second конкретные экземпляры, тип которых известен на момент вызова, то можно написать вот так:

    void Battle<T1, T2>(T1 first, T2 second, byte firstAmount, byte secondAmount) where T1 : Unit where T2 : Unit
    {
        List<T1> list1 = new List<T1>();
        List<T2> list2 = new List<T2>();
    }
    В данном случае, метод будет принимать только потомков вашего unit, но позволит использовать явную проверку типов. Кстати, если бы я писал такой метод, я бы вообще отказался от первых двух параметров. Просто бы использовал Generic с двумя типами, как у меня и оставил бы два параметра определяющих количество.
    Подробнее про Generic-и можете посмотреть здесь.
    • Помечено в качестве ответа Shirogatsu 4 сентября 2013 г. 0:08
    3 сентября 2013 г. 10:48
    Отвечающий

Все ответы

  • Можно в каждом классе задать свойство Name,
    где указывать соответствующее имя.

    2 сентября 2013 г. 22:05
  • Ну, дерево if-в с тегами/именами конечно построить можно, но мне кажется есть более подходящий способ, когда можно получить тип объекта и создать соответствующий массив.  Классы будут появляться новые, поэтому нужно что-то  всеядное :)
    2 сентября 2013 г. 22:09
  • В чём конкретно заключается неудобство этого кода?
    System.Array.CreateInstance(first.GetType(),firstAmount);
    3 сентября 2013 г. 0:06
  • Если у вас метод передаются в качестве First и Second конкретные экземпляры, тип которых известен на момент вызова, то можно написать вот так:

    void Battle<T1, T2>(T1 first, T2 second, byte firstAmount, byte secondAmount) where T1 : Unit where T2 : Unit
    {
        List<T1> list1 = new List<T1>();
        List<T2> list2 = new List<T2>();
    }
    В данном случае, метод будет принимать только потомков вашего unit, но позволит использовать явную проверку типов. Кстати, если бы я писал такой метод, я бы вообще отказался от первых двух параметров. Просто бы использовал Generic с двумя типами, как у меня и оставил бы два параметра определяющих количество.
    Подробнее про Generic-и можете посмотреть здесь.
    • Помечено в качестве ответа Shirogatsu 4 сентября 2013 г. 0:08
    3 сентября 2013 г. 10:48
    Отвечающий
  • Если у вас метод передаются в качестве First и Second конкретные экземпляры, тип которых известен на момент вызова, то можно написать вот так:

    void Battle<T1, T2>(T1 first, T2 second, byte firstAmount, byte secondAmount) where T1 : Unit where T2 : Unit
    {
        List<T1> list1 = new List<T1>();
        List<T2> list2 = new List<T2>();
    }
    В данном случае, метод будет принимать только потомков вашего unit, но позволит использовать явную проверку типов. Кстати, если бы я писал такой метод, я бы вообще отказался от первых двух параметров. Просто бы использовал Generic с двумя типами, как у меня и оставил бы два параметра определяющих количество.

    Пришел к абсолютно такому же решению, Ваш бы ответ пораньше, было бы поменьше мучений! :)
    4 сентября 2013 г. 0:08
  • В том и прелесть программирования, что одну задачу можно решить кучей способов. ;)

    4 сентября 2013 г. 3:54
    Отвечающий