|
Заблокирован
|
|
Создать новый объект того же типа, что существующий объект неизвестного типа31.07.2020, 16:00. Показов 5228. Ответов 47
Метки нет (Все метки)
Можно ли создать новый объект того же типа, что существующий объект неизвестного типа?
Есть некий объект obj1 Нужно создать новый объект obj2 того же типа. При этом будем считать, что сигнатура конструктора известна. Теоретически, получив из obj1 экземпляр типа System.Type, то бишь, obj1.GetType() и зная все типы, к которым может быть отнесен объект obj1, проведя операции сравнения с использованием typeof() от всех этих типов, наверное, это можно сделать. А можно как-то покороче? P.S. мы знаем, что что все возможные типы этого объекта являются потомками одного класса-родителя.
0
|
|
| 31.07.2020, 16:00 | |
|
Ответы с готовыми решениями:
47
Можно ли привести объект неизвестного типа к нужному по его имени? Не удаётся создать безымянный объект типа vector моего типа Интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект |
|
Заблокирован
|
||||||
| 01.08.2020, 17:40 [ТС] | ||||||
|
Если использовать вашу аналогию с транспортным средством,то у нас есть не универсальное, а вполне конкретное транспортное средство (объект), допустим мотоцикл конкретной марки. И аналогичный объект создать можно - с пом Activator.CreateInstance(...). Но поехать на нем (использовать его) нельзя. Потому что переменная типа object и компилятор выдаст ошибку при попытке обратиться к свойству объекта. То есть, на первом мотоцикле мы разъезжаем, а второй нам недоступен к использованию. То есть, задача не решена - ясно дело, что объекты (как и мотоциклы) создаются для использования. В том, что вы, вероятно, имеете ввиду, что для решения задачи нужны некие дополнительные конкретные сведения. И тогда на их основе может быть решение. Но по форме, оно выглядит так, что задача не просто решаема, а ещё и имеет много вариантов решения. И что дело не в том, что для решения, на самом деле, НЕОБХОДИМЫ дополнительные сведения. То есть, это уже другая задача. Пока буду обходиться более простыми средствами. Я для себя не вижу смысла в продолжении этого диалога. Тем более, что исходный вопрос не был связан с некой насущной необходимостью. Сам вопрос возник потому, что мне представляется, что в языке вполне могли бы быть простые средства, которые бы позволяли решить эту задачу в одну строку. Но, возможно, такой функционал был бы излишним. Я не собираюсь это оспаривать. На .Net и суда нет)
0
|
||||||
|
Модератор
|
|||
| 01.08.2020, 17:49 | |||
|
Свойство - это часть спецификации (метаданных) типа. Если вы знаете какое свойство вам нужно, из какого оно типа, то его можно получить. Даже если вы не знаете какой это тип, но знаете имя свойства, используя рефлексию, можно получить его описание, значение, изменить его значение. Добавлено через 4 минуты CreateInstance - возвращает объект-контейнер.Чтобы получить конкретный тип годный к применению, надо его привести к тому или иному типу. Так же как и с мотоциклом. Вам пришёл контейнер с неизвестным транспортным средством. Вы вскрыли контейнер и там оказался мотоцикл. И только после это вы можете знать что делает ваше транспортное средство, пришедшее в контейнере: летает, плавает или ездит.
0
|
|||
|
Заблокирован
|
|||
| 01.08.2020, 17:49 [ТС] | |||
|
0
|
|||
|
Модератор
|
|||
| 01.08.2020, 17:55 | |||
|
Так же как для грузового контейнера. В общем виде: "Составить опись содержимого" - задача решаема. А более конкретная: "Полететь на луну" - зависит от того что в контейнере. Мы вскрываем контейнер и проверяем есть ли у его содержимого функция (в нашей терминологии интерфейс) "Полёт на луну". Добавлено через 1 минуту Для привязок, которые работают со скоростью пользователя - вполне приемлемо. А для тысяч в секунду обращений - уже будут проблемы.
0
|
|||
|
Заблокирован
|
|||
| 01.08.2020, 18:00 [ТС] | |||
|
Один вопрос, чтобы подытожить кое-что общего характера. Я правильно понимаю (теперь), что компилятор принципиально занимается только переменными (в том числе их типами), а сами объекты можно анализировать (на предмет типов) только на этапе исполнения программы? Добавлено через 51 секунду
0
|
|||
|
1849 / 1193 / 501
Регистрация: 14.10.2018
Сообщений: 3,240
|
||||||||||||
| 01.08.2020, 18:57 | ||||||||||||
|
titan4ik, у вас вечная беда - хотите сделать универсальное средство. Вот вам вопрос тогда - находясь в точке А надо оказаться в точке Б. Ваш ответ на этот вопрос?
Если решать задачу по учебнику Шилдта, то примерно так выглядит решение. В коде специально рандомится объект, чтобы мы заранее не знали какой объект нам прилетел.
1
|
||||||||||||
|
Заблокирован
|
||
| 01.08.2020, 19:14 [ТС] | ||
|
Точнее, это моя маленькая беда и большая беда всего человечества
0
|
||
|
1849 / 1193 / 501
Регистрация: 14.10.2018
Сообщений: 3,240
|
|
| 01.08.2020, 19:16 | |
|
0
|
|
|
Заблокирован
|
||
| 01.08.2020, 19:22 [ТС] | ||
|
Добавлено через 54 секунды Enifan, некорректная аналогия.
0
|
||
|
1849 / 1193 / 501
Регистрация: 14.10.2018
Сообщений: 3,240
|
|
| 01.08.2020, 19:29 | |
|
0
|
|
| 01.08.2020, 19:32 [ТС] | |
|
0
|
|
|
1849 / 1193 / 501
Регистрация: 14.10.2018
Сообщений: 3,240
|
||
| 01.08.2020, 19:43 | ||
|
Я это все к тому, что нет универсального средства передвижения, для каждой задачи - свое решение. И в каждой созданной вами абстрактной теме - вам постоянно говорят - решение зависит от задачи, а универсального средства не существует. Может пора сделать вывод?
0
|
||
|
Заблокирован
|
|
| 01.08.2020, 19:46 [ТС] | |
|
Вопрос был о средствах языка, а не способе решения какой-то конретной задачи.
0
|
|
|
|
||
| 01.08.2020, 21:10 | ||
|
"Чего тебе ещё надо, хоронЯка?"(с)
0
|
||
|
Заблокирован
|
||||
| 01.08.2020, 21:44 [ТС] | ||||
|
Все что-то сообщили полезное прямо или косвенно. Всем спасибо.
0
|
||||
|
|
||
| 02.08.2020, 00:14 | ||
|
"Я не программист.", но всё ещё странно рассуждаете, хотя здесь не первый месяц. Иногда кажется что вы троль
, но нет, часто бывают интересные темы.
0
|
||
|
Заблокирован
|
|
| 02.08.2020, 00:37 [ТС] | |
|
HF,
![]() Поясняю: 1/Полагаю, что вместо сложных танцев с бубнами мог бы быть такой некий стандартный простой метод var obj2 = NewObjectCreate(obj1) (и его разновидности с параметрами, как у метода Activator.CreateInstance(...) Фактически, это почти тот же Activator.CreateInstance(...), но возвращающий переменную нужного типа, а не типа object На крайняк, этот метод нужно было бы перегружать в нужных классах. 2/ мозги у всех по-разному устроены. ![]() Плюс поколенческий разрыв - я же уже старый стал. Могу тупить и по этой причине ![]() Но мне естественнее формулировать вопросы в общем виде, чем спрашивать типа "как вот тут сделать, чтобы код заработал". Заставить код работать (для решения конкретной задачи) можно так или иначе - вы правы, языковых средств много и даже их минимума хватит, чтобы наваять большую программу. Ну, бывает и что-то конкретное спрашиваю
0
|
|
|
Модератор
|
||||||||||||||||||
| 02.08.2020, 10:51 | ||||||||||||||||||
|
Каким образом (даже чисто теоретически) компилятор может узнать, что в будущем будет передано в параметрах? Допустим, есть метод
с=15.Но требовать от компилятора такого понимания и замены...? Метод CreateInstance тоже самое.Где-то в коде есть присвоение Type t = ....;.Потом в другом месте CreateInstance(t).Как, даже чисто теоретически, компилятор может узнать что за тип будет находится в переменной t?Добавлено через 6 минут В некоторых случаях, он может для оптимизации кода его изменять. Допустим, вместо кода
a и b нигде ни используются, он может заменить на с=15;.Но заменить возвращаемый тип метода, компилятор ни как не сможет. Для этого надо передать параметры в метод, выполнить его, получить результат и анализировать его. Это уже можно сделать только при исполнении программы.
0
|
||||||||||||||||||
|
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
|
||
| 02.08.2020, 11:10 | ||
Сообщение было отмечено titan4ik как решение
Решение
titan4ik,
2
|
||
|
Заблокирован
|
|||||||
| 02.08.2020, 12:24 [ТС] | |||||||
|
Ура! Работает! Ура! Ура! Ура! ![]() Просто как всё гениальное. P.S. Риторически - теперь осталось понять зачем и когда это можно использовать ![]() Добавлено через 4 минуты Кстати, это работает даже без явного приведения типа, то есть и такое работает:
То бишь, тут главное обмануть компилятор)
0
|
|||||||
| 02.08.2020, 12:24 | |
|
Помогаю со студенческими работами здесь
40
Объект типа Объект.Использование - не всегда реален. Создать объект generic типа Как в методе создать объект типа? Как создать объект типа KeyEventArgs Как создать объект типа структура на ASP? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|