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

Создать новый объект того же типа, что существующий объект неизвестного типа

31.07.2020, 16:00. Показов 5049. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли создать новый объект того же типа, что существующий объект неизвестного типа?
Есть некий объект obj1
Нужно создать новый объект obj2 того же типа.
При этом будем считать, что сигнатура конструктора известна.
Теоретически, получив из obj1 экземпляр типа System.Type, то бишь, obj1.GetType() и зная все типы, к которым может быть отнесен объект obj1, проведя операции сравнения с использованием typeof() от всех этих типов, наверное, это можно сделать.
А можно как-то покороче?
P.S. мы знаем, что что все возможные типы этого объекта являются потомками одного класса-родителя.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2020, 16:00
Ответы с готовыми решениями:

Можно ли привести объект неизвестного типа к нужному по его имени?
Доброго времени суток! Есть один не стандартный вопрос. Например, есть какой - то класс, просто отдельный класс в отдельном от основной...

Не удаётся создать безымянный объект типа vector моего типа
Собсно #include <vector> using namespace std; //Вот мой австорский тип struct kletka { int i, j; kletka(int x, int...

Интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект. Не...

47
HF
 Аватар для HF
1303 / 882 / 199
Регистрация: 09.09.2011
Сообщений: 2,593
Записей в блоге: 2
31.07.2020, 16:10
Лучший ответ Сообщение было отмечено titan4ik как решение

Решение

Activator.CreateInstance не оно?
1
Заблокирован
31.07.2020, 16:17  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Activator.CreateInstance не оно?
Может и оно, нужно проверить)
Меня бы, наверное, вот такой вариант этого метода устроил - CreateInstance(Type, Object[])
Сейчас проверю.
0
Эксперт .NET
 Аватар для Usaga
14093 / 9310 / 1349
Регистрация: 21.01.2016
Сообщений: 34,980
31.07.2020, 16:24
Цитата Сообщение от titan4ik Посмотреть сообщение
Можно ли создать новый объект того же типа, что существующий объект неизвестного типа?
Не факт) Если у класса этого объекта нет конструктора по умолчанию, то никакой Activator.CreateInstance вам не поможет.
0
Заблокирован
31.07.2020, 16:28  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Если у класс этого объекта нет конструктора по умолчанию, то никакой Activator.CreateInstance вам не поможет.
Так Activator.CreateInstance вроде бы позволяет параметры задать. А конструктор подбирается вроде под параметры - по сигнатуре.
Создает экземпляр указанного типа, используя конструктор, который наиболее полно соответствует указанным параметрам.
https://docs.microsoft.com/ru-... mework-4.8

Я пока увидел другую проблему - с пом Activator.CreateInstance создается объект типа objeсt, а не нужного типа.
0
Эксперт .NET
 Аватар для Usaga
14093 / 9310 / 1349
Регистрация: 21.01.2016
Сообщений: 34,980
31.07.2020, 16:29
Цитата Сообщение от titan4ik Посмотреть сообщение
Так Activator.CreateInstance вроде бы позволяет параметры задать. А констуртор подбирается вроде под параметры - по сигнатуре.
Есть такое. Только если ваш код знает смысл этих параметров, то он знает и тип создаваемого объекта. А если не знает смысла параметров, то как он их может передать?))

Цитата Сообщение от titan4ik Посмотреть сообщение
Я пока увидел другую проблему - с пом Activator.CreateInstance создается объект типа objeсt, а не нужного типа.
Это не проблема. Надо делать каст к нужному типу.
0
Заблокирован
31.07.2020, 16:32  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Надо делать каст к нужному типу.
каст - то что такое?
0
Эксперт .NET
 Аватар для Usaga
14093 / 9310 / 1349
Регистрация: 21.01.2016
Сообщений: 34,980
31.07.2020, 16:34
titan4ik, приведение к желаемому типу. Только тут встаёт вопрос: если вы этот тип знаете, то что мешает создать его руками?
0
Заблокирован
31.07.2020, 16:46  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Только если ваш код знает смысл этих параметров, то он знает и тип создаваемого объекта. А если не знает смысла параметров, то как он их может передать?))
Да, нужно покумекать - не запутался ли я тут в трех соснах (как обычно)

Добавлено через 5 минут
Цитата Сообщение от Usaga Посмотреть сообщение
приведение к желаемому типу. Только тут встаёт вопрос: если вы этот тип знаете, то что мешает создать его руками?
Usaga,
объект есть. А типа я не знаю. И поэтому не могу привести.
Вот такие условия. Или это глупость? Может и глупость.
Но мне казалось, что если есть объект, то "умный компутер" должен знать о нем всё, включая тип - есть же obj1.GetType() . И соответственно, есть способ создания тут же нового объекта данного типа.
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,207
31.07.2020, 19:13
Цитата Сообщение от titan4ik Посмотреть сообщение
создается объект типа objeсt, а не нужного типа
Очередной раз пишу - не надо путать ссылки и объекты. Через ту же рефлексию объект будет создан нужного типа, а вот ссылка будет либо object, либо если известна иерархия классов - ссылка базового класса. Только вот возникает проблема другая - как вызвать метод "имеющий конкретный класс" если мы даже не знаем объект какого класса у нас. Приведение типов - ок, а дальше что - вызывать метод GetMethods. Реально - да, стоит ли оно того - решать вам.
Возникает вопрос - почему так сложно - потому что дело обстоит в рантайме, и заранее неизвестно что у нас за тип такой, и чтобы не словить эксепшен - приходиться делать все эти выкрутасы.
0
HF
 Аватар для HF
1303 / 882 / 199
Регистрация: 09.09.2011
Сообщений: 2,593
Записей в блоге: 2
31.07.2020, 19:39
Цитата Сообщение от titan4ik Посмотреть сообщение
Да, нужно покумекать - не запутался ли я тут в трех соснах (как обычно)
Задачу или цель опишите. Может быть по другому сделать нужно. Или путь верный, но будет не просто.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
01.08.2020, 13:51
Цитата Сообщение от titan4ik Посмотреть сообщение
Можно ли создать новый объект того же типа, что существующий объект неизвестного типа?
Можно.
Но такая задача лишена смысла.
Наверняка вам требуется не ЛЮБОЙ неизвестный тип, а какой-то из допустимых типов.

Добавлено через 3 минуты
Цитата Сообщение от titan4ik Посмотреть сообщение
мы знаем, что что все возможные типы этого объекта являются потомками одного класса-родителя.
Если у вас есть родительский тип и производные от него, имеется ввиду создание одного из этих типов, то задача приобретает смысл.

Но нужно уточнение, нужно создание НОВОГО объекта того же типа или нового объекта КОПИИ существующего?

Добавлено через 2 минуты
Цитата Сообщение от titan4ik Посмотреть сообщение
каст - то что такое?
Псевдокод:
C#
1
2
3
4
5
6
class A{}
class B:A {}
class С:A {}
 
B b = new B();
A a = (A) B.Clone();
0
Заблокирован
01.08.2020, 15:22  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Можно.
Тогда покажите как именно это можно (если это не займет у вас много времени).
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но нужно уточнение, нужно создание НОВОГО объекта того же типа или нового объекта КОПИИ существующего?
Нового.
Для простоты можно считать, что у данного класса есть конструктор без параметров.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
01.08.2020, 15:42
Цитата Сообщение от titan4ik Посмотреть сообщение
Тогда покажите как именно это можно (если это не займет у вас много времени).
Есть ли у этих типов общий базовый класс?
0
Заблокирован
01.08.2020, 15:47  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Есть ли у этих типов общий базовый класс?
Цитата Сообщение от titan4ik Посмотреть сообщение
Можно ли создать новый объект того же типа, что существующий объект неизвестного типа?
Есть некий объект obj1
Нужно создать новый объект obj2 того же типа.
Интересует задача в общем виде. Есть объект, создайте объект этого же класса.
Для простоты можно считать, что мы знаем, что у этого класса есть конструктор без параметров.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
01.08.2020, 15:54
Цитата Сообщение от titan4ik Посмотреть сообщение
Интересует задача в общем виде
В общем виде задача не имеет решения, поскольку вы получите экземпляр в типе object и дальше с ним ничего делать не сможете.
Или полностью работать с ним через рефлексию, что крайне не эффективно и применяется в исключительных случаях.

Это всё равно, что сказать "хочу создать программу в общем виде для решения любой задачи".

Добавлено через 4 минуты
Цитата Сообщение от titan4ik Посмотреть сообщение
Для простоты можно считать, что мы знаем, что у этого класса есть конструктор без параметров.
С параметрами или нет создаёт Activator.CreateInstance(...).
Но толку?
Получили объект и что с ним делать?
Чтобы что-то делать с ним нужны его члены.
В конкретной задаче нужны конкретные методы, свойства, поля.
Соответственно они должны быть прописаны или в общем базовом классе или в интерфейсах.

Тогда можно будет привести полученный object к нужному типу и использовать его для выполнения задачи.
0
Заблокирован
01.08.2020, 16:05  [ТС]
Цитата Сообщение от titan4ik Посмотреть сообщение
Можно ли создать новый объект того же типа, что существующий объект неизвестного типа?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Можно.
Цитата Сообщение от titan4ik Посмотреть сообщение
Тогда покажите как именно это можно (если это не займет у вас много времени).
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В общем виде задача не имеет решения
То есть, на самом деле - не можно.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Получили объект и что с ним делать?
Чтобы что-то делать с ним нужны его члены.
В конкретной задаче нужны конкретные методы, свойства, поля.
Соответственно они должны быть прописаны или в общем базовом классе или в интерфейсах.
А они и прописаны. Раз есть объект, то есть и соответствующи класс, где прописано всё, что должно быть там прописано.
Я понял, что вы высказались поспешно. На самом деле - не можно.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
01.08.2020, 16:23
Цитата Сообщение от titan4ik Посмотреть сообщение
А они и прописаны. Раз есть объект, то есть и соответствующи класс, где прописано всё, что должно быть там прописано.
Я понял, что вы высказались поспешно. На самом деле - не можно.
Нет!
Можно - это значит МОЖНО.

Просто я не могу понять, что вы хотите потом с этим объектом делать?

Вот вы получили новый объект object obj = Activator.CreateInstance(...);.
Дальше что?

Да можно получить его члены через рефлексию.
Допустим, вывести названия и значения всех свойств или полей.
Если вы делаете что-то типа редактора с окном "Свойства" объекта - это имеет смысл.
Будет таблица с названиями и в которой вы сможете смотреть и изменять значения свойств.

Какое ещё может применение для этой информации?
Можно используя её сделать кастомный аналого привязок используемых в WPF.
Пример: Разъяснение PropertyDescriptor: Почему в некоторых случаях Binding правильно работает без INPC (INotifyPropertyChanged)?

Что ещё?

"Можно ли сделать транспортное средство?" - Конечно, можно! Но какое?
"Меня интересует в общем виде." - Как это в общем? Чтобы и землю на даче таскать и на луну лететь?
"А, ну, значит нельзя. Я понял, что вы высказались поспешно. На самом деле - не можно." - ....??? !!!
0
Заблокирован
01.08.2020, 16:57  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вот вы получили новый объект object obj = Activator.CreateInstance(...);.
Тип этого объекта object
С этим всё ясно стало много выше вашего вступления в тему.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
"Можно ли сделать транспортное средство?" - Конечно, можно! Но какое?
Что значит какое? У на есть конкретный объект во всей своей красе.
"В общем виде" - эта формулировка касалась вашего вопроса о том, знает ли мы, что у объектов есть один родительский класс. Имелось ввиду, что нет - не знаем.
Спасибо за участие в обсуждении.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
01.08.2020, 17:09
Цитата Сообщение от titan4ik Посмотреть сообщение
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вот вы получили новый объект object obj = Activator.CreateInstance(...);
Тип этого объекта object
НЕТ!!!
object - это тип ПЕРЕМЕННОЙ.
А тип ОБЪЕКТА, тот который задан в параметрах CreateInstance.
C#
1
2
3
4
5
6
int num = 10;
object obj = num; // Тип переменной object, но тип объекта int.
 
int sum = obj + 5; // Ошибка.
 
int sum = (int)  obj + 5; // Правильно.
То есть object может хранить ссылку на любой объект.
Но чтобы использовать этот объект, надо знать что у него за тип.

Поэтому "создать объект заданного типа" - это ЧАСТЬ задачи.
И без второй части "чтобы таким-то образом можно было этот объект использовать" - эту задачу не решить.

Не потому, что её НЕВОЗМОЖНО решить, а потому, что СЛИШКОМ МНОГО ВАРИАНТОВ решения, но каждое из них не может быть АБСОЛЮТНО УНИВЕРСАЛЬНО.

Так же как и с транспортным средством.
МОЖНО создать транспортное средство под любое конкретное применение, но НЕЛЬЗЯ создать абсолютно универсальное транспортное средство.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2020, 17:09
Помогаю со студенческими работами здесь

Объект типа Объект.Использование - не всегда реален.
При формировании отчета выдает ошибку "Значение не является значением объектного типа (Использование)" В чем может быть проблема?...

Создать объект generic типа
Hi. есть абстрактный класс GraphRepresent: public abstract class GraphRepresent {} и несколько классов public class...

Как в методе создать объект типа?
Как в методе GetById создать объект типа ZipCodeModel. Такой вопрос спросить? КОД! public class ZipCodeModel { ...

Как создать объект типа KeyEventArgs
Как создать объект типа KeyEventArgs с e.Key = Key.Return? Пробовал KeyEventArgs KlavKeyTemp = new KeyEventArgs (); Конструктор...

Как создать объект типа структура на ASP?
Скажите, а как можно на ASP создать структуру? Я имею ввиду аналог переменной типа record как на Паскале.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru