Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397

Создать instance по переменной типа "Тип"

19.07.2015, 04:28. Показов 2131. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. У меня есть такой код
C#
1
2
3
4
5
6
7
8
var tuples = new List<Tuple<int, Type>>() 
                {
                    new Tuple<int, Type>(Rules.NumberOfAirCarriers, typeof(AirCarrier)),
                    new Tuple<int, Type>(Rules.NumberOfBattleships, typeof(Battleship)),
                    new Tuple<int, Type>(Rules.NumberOfCruisers, typeof(Cruiser)),
                    new Tuple<int, Type>(Rules.NumberOfDestroyers, typeof(Destroyer)),
                    new Tuple<int, Type>(Rules.NumberOfSubmarines, typeof(Submarine))
                };
Хочу сделать что-то вроде такого:
C#
1
2
3
4
5
6
7
foreach (var tuple in tuples)
{
    for (int j = 0; j < tuple.Item1; j++)
    {
        Ship ship = Activator.CreateInstance(tuple.Item2);
    }
}
Не работает нифига....
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.07.2015, 04:28
Ответы с готовыми решениями:

Можно ли создать объект некоторого типа, если тип хранится в переменной
Здравствуйте! Подскажите, пожалуйста, могу ли я в С# создать объект, если тип объекта храниться в переменной. Например, в метод...

Получить тип переменной и задать её переменной типа тип
то есть int A = 213213 Type B = A.GetType() - ну надо что-то вроде этого но для Type b = typeof(a.Max(p =&gt;...

Создать структурный тип с полями простого типа и типа перечисления
Всем привет! Может кто нибудь подсказать, суть данного задания? (Возможно - на примере) Создать тип (Целый) перечисления. (Осень:...

8
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
19.07.2015, 09:30
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Не работает нифига....
Просто не работает, ошибки? указывайте конкретнее причину

Pro100Tom,
У классов есть конструктор по умолчанию?

Все работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
            var tuples = new List<Tuple<int, Type>>()
            {
                new Tuple<int, Type>(Rules.NumberOfAirCarriers, typeof (AirCarrier))
            };
 
            foreach (var tuple in tuples)
            {
                for (int j = 0; j < tuple.Item1; j++)
                {
                    Ship ship = (Ship) Activator.CreateInstance(tuple.Item2);
                }
            }
0
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
19.07.2015, 13:30  [ТС]
Не работает "Additional information: No parameterless constructor defined for this object."
Ship - абстрактный класс.

Конечно есть.
C#
1
2
3
4
5
6
7
8
9
10
11
public class Destroyer : Ship
    {
        static Destroyer()
        {
            Types.Add(typeof(Destroyer), new List<ShipType> { ShipType.Straight });
        }
 
        public Destroyer(ShipType type = ShipType.Straight)
        {
            Type = type;
        }
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
19.07.2015, 13:51
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Конечно есть.
ошибка говорит о том - что его нет. создайте открытый конструктор без параметров.
0
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
19.07.2015, 14:11  [ТС]
Блин блинский, как я затупил... Я думал, что, если параметер имеет default значение, (а я создавал instances имеено без параметров (new AirCarrier())), то создалась иллюзия, что конструктор без параметров всё-таки имеется.
C#
1
2
3
4
public Destroyer(ShipType type = ShipType.Straight)
        {
            Type = type;
        }
Мол снаружи-то кажется, что без параметров, а по сути, то параметер есть. Спасибо.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
19.07.2015, 14:17
Лучший ответ Сообщение было отмечено Pro100Tom как решение

Решение

Цитата Сообщение от Pro100Tom Посмотреть сообщение
Не работает "Additional information: No parameterless constructor defined for this object."
Всё правильно. С точки зрения C# конструктор класса Ship не является конструктором без аргументов. И не важно что у единственного аргумента есть значение по умолчанию. Дело в том что аргументы по умолчанию это синтаксический сахар. Компилятор подставляет их значения в место вызова. Activator.CreateInstance этого не делает. Поэтому надо передавать значения аргумент явно или переписать класс Ship. Первый вариант тебе не подходит т.к. ты не знаешь какие типы будешь создавать и какие у них конструкторы. Для второго вариант переписываем класс следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
public class Destroyer : Ship
{
    public Destroyer() : this (ShipType.Straight)
    {
    }
    
    public Destroyer(ShipType type)
    {
        Type = type;
    }
}
Ну и наконец никто не запрещает нам написать свою реализацию CreateInstance чтобы принять во внимание аргументы по умолчанию:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static object CreateInstance(Type t)
{
    var constructors = t.GetConstructors();
    
    // Проверям есть ли конструктор баз аргументов
    if (constructors.Any(c => c.GetParameters().Length == 0))
    {
        return Activator.CreateInstance(t);
    }
    
    constructors = constructors.Where(c => c.GetParameters().All(p => p.HasDefaultValue)).ToArray();
    if (constructors.Length == 1)
    {
        var parameters = constructors[0].GetParameters().Select(p => p.DefaultValue).ToArray();
        return Activator.CreateInstance(t, parameters);
    }
    
    return Activator.CreateInstance(t);
}
1
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
19.07.2015, 14:17  [ТС]
А как тогда сделать createInstance с параметром?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
19.07.2015, 14:24
Pro100Tom, посмотри на строку №15 во втором примере в моем ответе. Там вызывается Activator.CreateInstance(Type type, params object[] args).
0
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
20.07.2015, 00:05  [ТС]
Спасибо огромное! Я свой последний вопрос задал до того, как увидел ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.07.2015, 00:05
Помогаю со студенческими работами здесь

Создать переменную типа, хранящегося в переменной типа Type
Здравствуйте. Гугл не помог, потому обращаюсь за помощью к вам. Пишу загрузку (не важно чего) из файла, данные хранятся в формате...

Создать собственный тип сложной переменной – заболеваемость
Уважаемые, помогите, пожалуйста, с решение задачи. Задача Создать собственный тип сложной переменной – заболеваемость. Создать массив...

Создать массив типа переменной
Как создать массив с типом переданной переменной. static Array Combine(params object commonArr) { ...

Приведение переменной типа object к переменной производного типа в приложенном коде
Добрый день! Столкнулся с проблемой. Есть обработчик события. Обработчик события общий для двух издателей, но издатели разного типа(Пусть...

Значение переменной типа boolean присвоить переменной типа integer
Мне как-то говорили, но скорее всего не найду. В учебнике не нашёл в обоих разделах. Подскажите пожалуйста. Заранее спасибо. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru