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

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

31.07.2020, 16:00. Показов 5228. Ответов 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
Заблокирован
01.08.2020, 17:40  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
object - это тип ПЕРЕМЕННОЙ.
ОК. Я не корректно выразился. Нужно быть с этим аккуратнее. Спасибо.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поэтому "создать объект заданного типа" - это ЧАСТЬ задачи.
И без второй части "чтобы таким-то образом можно было этот объект использовать" - эту задачу не решить.
Правильно. В этом и проблема.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не потому, что её НЕВОЗМОЖНО решить, а потому, что СЛИШКОМ МНОГО ВАРИАНТОВ решения, но каждое из них не может быть АБСОЛЮТНО УНИВЕРСАЛЬНО.
Так же как и с транспортным средством.
МОЖНО создать транспортное средство под любое конкретное применение, но НЕЛЬЗЯ создать абсолютно универсальное транспортное средство.
А вот это некорректные логические построения. Алогичные.
Если использовать вашу аналогию с транспортным средством,то у нас есть не универсальное, а вполне конкретное транспортное средство (объект), допустим мотоцикл конкретной марки.
И аналогичный объект создать можно - с пом Activator.CreateInstance(...). Но поехать на нем (использовать его) нельзя. Потому что переменная типа object и компилятор выдаст ошибку при попытке обратиться к свойству объекта.
То есть, на первом мотоцикле мы разъезжаем, а второй нам недоступен к использованию. То есть, задача не решена - ясно дело, что объекты (как и мотоциклы) создаются для использования.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
эту задачу не решить.
Не потому, что её НЕВОЗМОЖНО решить, а потому, что СЛИШКОМ МНОГО ВАРИАНТОВ решения, но каждое из них не может быть АБСОЛЮТНО УНИВЕРСАЛЬНО.
В чем, на мой взгляд, алогичность этого высказывания.
В том, что вы, вероятно, имеете ввиду, что для решения задачи нужны некие дополнительные конкретные сведения. И тогда на их основе может быть решение.
Но по форме, оно выглядит так, что задача не просто решаема, а ещё и имеет много вариантов решения. И что дело не в том, что для решения, на самом деле, НЕОБХОДИМЫ дополнительные сведения. То есть, это уже другая задача.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Да можно получить его члены через рефлексию.
я так понимаю, что без крайней нужды рефлексировать не стоит.
Пока буду обходиться более простыми средствами.
Я для себя не вижу смысла в продолжении этого диалога.
Тем более, что исходный вопрос не был связан с некой насущной необходимостью.
Сам вопрос возник потому, что мне представляется, что в языке вполне могли бы быть простые средства, которые бы позволяли решить эту задачу в одну строку. Но, возможно, такой функционал был бы излишним. Я не собираюсь это оспаривать.
На .Net и суда нет)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,144
Записей в блоге: 2
01.08.2020, 17:49
Цитата Сообщение от titan4ik Посмотреть сообщение
И аналогичный объект создать можно - с пом Activator.CreateInstance(...). Но поехать на нем (использовать его) нельзя. Потому что переменная типа object и компилятор выдаст ошибку при попытке обратиться к свойству объекта.
Не выдаст!
Свойство - это часть спецификации (метаданных) типа.
Если вы знаете какое свойство вам нужно, из какого оно типа, то его можно получить.
Даже если вы не знаете какой это тип, но знаете имя свойства, используя рефлексию, можно получить его описание, значение, изменить его значение.

Добавлено через 4 минуты
Цитата Сообщение от titan4ik Посмотреть сообщение
И аналогичный объект создать можно - с пом Activator.CreateInstance(...). Но поехать на нем (использовать его) нельзя.
CreateInstance - возвращает объект-контейнер.
Чтобы получить конкретный тип годный к применению, надо его привести к тому или иному типу.
Так же как и с мотоциклом.
Вам пришёл контейнер с неизвестным транспортным средством.
Вы вскрыли контейнер и там оказался мотоцикл.
И только после это вы можете знать что делает ваше транспортное средство, пришедшее в контейнере: летает, плавает или ездит.
0
Заблокирован
01.08.2020, 17:49  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
из какого оно типа
Если известен тип, то просто привести к типу и всё. Это понятно.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Даже если вы не знаете какой это тип, но знаете имя свойства, используя рефлексию, можно получить его описание, значение, изменить его значение.
ок
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,144
Записей в блоге: 2
01.08.2020, 17:55
Цитата Сообщение от titan4ik Посмотреть сообщение
И что дело не в том, что для решения, на самом деле, НЕОБХОДИМЫ дополнительные сведения. То есть, это уже другая задача.
В общем виде задачу я вам привёл: создать таблицу свойств с возможностью их изменения.

Так же как для грузового контейнера.
В общем виде: "Составить опись содержимого" - задача решаема.
А более конкретная: "Полететь на луну" - зависит от того что в контейнере.
Мы вскрываем контейнер и проверяем есть ли у его содержимого функция (в нашей терминологии интерфейс) "Полёт на луну".

Добавлено через 1 минуту
Цитата Сообщение от titan4ik Посмотреть сообщение
я так понимаю, что без крайней нужды рефлексировать не стоит.
Она медленная.
Для привязок, которые работают со скоростью пользователя - вполне приемлемо.
А для тысяч в секунду обращений - уже будут проблемы.
0
Заблокирован
01.08.2020, 18:00  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В общем виде задачу я вам привёл: создать таблицу свойств с возможностью их изменения.
Понятно, это такой "турецкий поход" (длинный путь).
Один вопрос, чтобы подытожить кое-что общего характера.
Я правильно понимаю (теперь), что компилятор принципиально занимается только переменными (в том числе их типами), а сами объекты можно анализировать (на предмет типов) только на этапе исполнения программы?

Добавлено через 51 секунду
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Она медленная.
Для привязок, которые работают со скоростью пользователя - вполне приемлемо.
А для тысяч в секунду обращений - уже будут проблемы.
Спасибо за пояснение.
0
 Аватар для Enifan
1849 / 1193 / 501
Регистрация: 14.10.2018
Сообщений: 3,240
01.08.2020, 18:57
titan4ik, у вас вечная беда - хотите сделать универсальное средство. Вот вам вопрос тогда - находясь в точке А надо оказаться в точке Б. Ваш ответ на этот вопрос?
Если решать задачу по учебнику Шилдта, то примерно так выглядит решение. В коде специально рандомится объект, чтобы мы заранее не знали какой объект нам прилетел.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Reflection;
 
class A {
    public virtual void Foo() => Console.WriteLine("class A");
}
 
class B : A {
    public override void Foo() => Console.WriteLine("class B");
}
 
class C : B {
    public override void Foo() => Console.WriteLine("class C");
}
 
class Program
{
    static void Main()
    {
        object[] arr = { new A(), new B(), new C() };
        Random random = new Random();
        object ob = arr[random.Next(arr.Length)];
        Type type = ob.GetType();
        MethodInfo[] infos = type.GetMethods();
        foreach (var info in infos)
        {
            if (info.Name.CompareTo("Foo") == 0)
                info.Invoke(ob, null);
        }
 
        Console.ReadKey();
    }
}
Цитата Сообщение от titan4ik Посмотреть сообщение
Если использовать вашу аналогию с транспортным средством,то у нас есть не универсальное, а вполне конкретное транспортное средство (объект), допустим мотоцикл конкретной марки.
И аналогичный объект создать можно - с пом Activator.CreateInstance(...). Но поехать на нем (использовать его) нельзя. Потому что переменная типа object и компилятор выдаст ошибку при попытке обратиться к свойству объекта.
Для этого и придумал наследование и переопределение методов. Если стоит задача воспользоваться транспортом для перемещения - создается базовый метод и переопределяется в нужных наследниках. И через ссылку базового класса, которая ссылается на конкретный объект - идет вызов метода.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
 
abstract class Transport {
    abstract public void Go();
}
 
class Car : Transport {
    public override void Go() => Console.WriteLine("Поехали");
}
 
class Airplane : Transport {
    public override void Go() => Console.WriteLine("Полетели");
}
 
class Program
{
    static void Main()
    {
        Transport ts1 = new Car();
        ts1.Go(); // если шо, ссылка Transport
 
        Transport ts2 = new Airplane();
        ts2.Go(); // таже петрушка, ссылка типа Transport
 
        Console.ReadKey();
    }
}
1
Заблокирован
01.08.2020, 19:14  [ТС]
Цитата Сообщение от Enifan Посмотреть сообщение
у вас вечная беда - хотите сделать универсальное средство.
Это не моя беда. Это - беда всего человечества. Это научный метод - сиречь, обобщение.
Точнее, это моя маленькая беда и большая беда всего человечества
0
 Аватар для Enifan
1849 / 1193 / 501
Регистрация: 14.10.2018
Сообщений: 3,240
01.08.2020, 19:16
Цитата Сообщение от titan4ik Посмотреть сообщение
Это не моя беда
ваш ответ на вопрос про перемещение из точки А в точку Б ?
0
Заблокирован
01.08.2020, 19:22  [ТС]
Цитата Сообщение от Enifan Посмотреть сообщение
ваш ответ на вопрос про перемещение из точки А в точку Б ?
Вот что, боец, ноги в руки и чтобы в час "Ч" был в точке "Б"!

Добавлено через 54 секунды
Enifan,
некорректная аналогия.
0
 Аватар для Enifan
1849 / 1193 / 501
Регистрация: 14.10.2018
Сообщений: 3,240
01.08.2020, 19:29
Цитата Сообщение от titan4ik Посмотреть сообщение
Вот что, боец, ноги в руки и чтобы в час "Ч" был в точке "Б"!
а если точка А - это город Москва, а точка Б - это Луна ?
0
01.08.2020, 19:32  [ТС]

Не по теме:

Цитата Сообщение от Enifan Посмотреть сообщение
а если точка А - это город Москва, а точка Б - это Луна ?
Enifan,
видать вы в армии не служили (как и я) :D
Если точка А - это город Москва, а точка Б - это Луна, это значит, что подошло время гос приемки очередного космического проекта и тебе, боец, выпала большая есть его реализовать. Вопросы есть? Нет вопросов. Вперёд!

0
 Аватар для Enifan
1849 / 1193 / 501
Регистрация: 14.10.2018
Сообщений: 3,240
01.08.2020, 19:43
Цитата Сообщение от titan4ik Посмотреть сообщение
подошло время гос приемки очередного космического проекта
а если надо попасть в точку Б - а это глубина моря более 1000 метров, что делать будем ?

Я это все к тому, что нет универсального средства передвижения, для каждой задачи - свое решение. И в каждой созданной вами абстрактной теме - вам постоянно говорят - решение зависит от задачи, а универсального средства не существует. Может пора сделать вывод?
0
Заблокирован
01.08.2020, 19:46  [ТС]
Вопрос был о средствах языка, а не способе решения какой-то конретной задачи.
0
HF
 Аватар для HF
1319 / 899 / 200
Регистрация: 09.09.2011
Сообщений: 2,698
Записей в блоге: 2
01.08.2020, 21:10
Цитата Сообщение от titan4ik Посмотреть сообщение
Вопрос был о средствах языка, а не способе решения какой-то конретной задачи.
Помоему вы начинаете "сливаться". Я поглядываю в обсуждение и замечаю, что вы так конкретной проблемы не озвучили. И "Enifan" дал вам отличный пример неопределённых типов и возможности их даже использовать. И становится не понятно какое вам решение надо, или что конкретно в примерах не удовлетворяет условиям задачи/решения.
"Чего тебе ещё надо, хоронЯка?"(с)
0
Заблокирован
01.08.2020, 21:44  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
вы так конкретной проблемы не озвучили
Цитата Сообщение от titan4ik Посмотреть сообщение
Вопрос был о средствах языка, а не способе решения какой-то конретной задачи.
Добавлено через 2 минуты
Цитата Сообщение от HF Посмотреть сообщение
"Enifan" дал вам отличный пример неопределённых типов и возможности их даже использовать.
Да, хороший пример.
Все что-то сообщили полезное прямо или косвенно.
Всем спасибо.
0
HF
 Аватар для HF
1319 / 899 / 200
Регистрация: 09.09.2011
Сообщений: 2,698
Записей в блоге: 2
02.08.2020, 00:14
"Я не программист.", но всё ещё странно рассуждаете, хотя здесь не первый месяц. Иногда кажется что вы троль , но нет, часто бывают интересные темы.

Цитата Сообщение от titan4ik Посмотреть сообщение
Вопрос был о средствах языка, а не способе решения какой-то конретной задачи.
Это же не вилка, где все "средства" можно в паре пунктов описать. И ощущение что вы подходите с обратного конца. Сначала есть конкретная задача, потом ищут/подбирают средства. А вы словно "узнаю когда найду". Средства языка настолько обширны, что бесполезно пытаться вам подсовывать идеи без маломальского понимания цели.
0
Заблокирован
02.08.2020, 00:37  [ТС]
HF,
Поясняю:
1/Полагаю, что вместо сложных танцев с бубнами мог бы быть такой некий стандартный простой метод
var obj2 = NewObjectCreate(obj1) (и его разновидности с параметрами, как у метода Activator.CreateInstance(...)
Фактически, это почти тот же Activator.CreateInstance(...), но возвращающий переменную нужного типа, а не типа object
На крайняк, этот метод нужно было бы перегружать в нужных классах.
2/ мозги у всех по-разному устроены.
Плюс поколенческий разрыв - я же уже старый стал. Могу тупить и по этой причине
Но мне естественнее формулировать вопросы в общем виде, чем спрашивать типа "как вот тут сделать, чтобы код заработал".
Заставить код работать (для решения конкретной задачи) можно так или иначе - вы правы, языковых средств много и даже их минимума хватит, чтобы наваять большую программу.
Ну, бывает и что-то конкретное спрашиваю
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,144
Записей в блоге: 2
02.08.2020, 10:51
Цитата Сообщение от titan4ik Посмотреть сообщение
Фактически, это почти тот же Activator.CreateInstance(...), но возвращающий переменную нужного типа, а не типа object
Он же получает данные в своих параметрах во время ИСПОЛНЕНИЯ программы.
Каким образом (даже чисто теоретически) компилятор может узнать, что в будущем будет передано в параметрах?

Допустим, есть метод
C#
1
int Sum (int x, int y) => x+y;
Есть его вызов:
C#
1
2
3
int a = 10;
int b = 5;
int с = Sum(a, b);
Логически мы понимаем, что это эквивалентно с=15.
Но требовать от компилятора такого понимания и замены...?

Метод CreateInstance тоже самое.
Где-то в коде есть присвоение Type t = ....;.
Потом в другом месте CreateInstance(t).
Как, даже чисто теоретически, компилятор может узнать что за тип будет находится в переменной t?

Добавлено через 6 минут
Цитата Сообщение от titan4ik Посмотреть сообщение
Я правильно понимаю (теперь), что компилятор принципиально занимается только переменными (в том числе их типами), а сами объекты можно анализировать (на предмет типов) только на этапе исполнения программы?
Компилятор занимается только тем, что может быть известно на момент компиляции.
В некоторых случаях, он может для оптимизации кода его изменять.

Допустим, вместо кода
C#
1
2
3
int a = 10;
int b = 5;
int с = a + b;
Если переменные a и b нигде ни используются, он может заменить на с=15;.

Но заменить возвращаемый тип метода, компилятор ни как не сможет.
Для этого надо передать параметры в метод, выполнить его, получить результат и анализировать его.
Это уже можно сделать только при исполнении программы.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
02.08.2020, 11:10
Лучший ответ Сообщение было отмечено titan4ik как решение

Решение

titan4ik,
object obj = Activator.CreateInstance()
Кастуете obj к dynamyc и пользуетесь ей так, как пользовались бы обычным объектом.
Миниатюры
Создать новый объект того же типа, что существующий объект неизвестного типа  
2
Заблокирован
02.08.2020, 12:24  [ТС]
Цитата Сообщение от Рядовой Посмотреть сообщение
Кастуете obj к dynamyc и пользуетесь ей так, как пользовались бы обычным объектом.
А вот это уже та самая вишенка на торте, без которой торт теряет своё гордое имя!
Ура!
Работает!
Ура! Ура! Ура!

Просто как всё гениальное.
P.S. Риторически - теперь осталось понять зачем и когда это можно использовать

Добавлено через 4 минуты
Кстати, это работает даже без явного приведения типа, то есть и такое работает:
C#
1
dynamic t = Activator.CreateInstance(f.GetType());
Добавлено через 56 секунд
То бишь, тут главное обмануть компилятор)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2020, 12:24
Помогаю со студенческими работами здесь

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

Создать объект 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 как на Паскале.


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
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. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru