Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
.NET 4.x

Рефлексия - объясните, что происходит

25.02.2018, 15:07. Показов 2136. Ответов 31

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые знатоки.
Имеем код:
C#
1
2
3
4
Type type = Type.GetType("TrOperMov.Model.mTrOperMov"); // получаем метаописание типа объекта
ConstructorInfo[] constrs= type.GetConstructors();      // получаем конструктора объекта
var constr = constrs[0];                                // получаем конструктор 
var obj = constr.Invoke(null);                          // Вызываем конструктор, получаем объект
Внимание, вопрос. Какой у объекта тип?

Ха-ха, скажете вы. Конструктор всегда возвращает объект, и в нашем случае это экземпляр класса mTrOperMov.
Однако, в отладчике я наблюдаю такую картину:

C#
1
2
3
Имя              Значение                        Тип
obj             {TrOperMov.Model.mTrOperMov}    object {TrOperMov.Model.mTrOperMov}
(mTrOperMov)obj {TrOperMov.Model.mTrOperMov}    TrOperMov.Model.mTrOperMov
Т.е. тип объекта object {TrOperMov.Model.mTrOperMov}, а должен быть TrOperMov.Model.mTrOperMov

Как получить нужный тип (TrOperMov.Model.mTrOperMov), используя рефлексию???
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2018, 15:07
Ответы с готовыми решениями:

Объясните, что происходит в части кода
Алгоритм сортировки простым слиянием Шаг 1. Исходный файл A разбивается на два вспомогательных файла B и C. Шаг 2. Вспомогательные...

Объясните принцип действия foreach: что происходит с переменными
Интересует такой вопрос - когда мы пишем что то наподобее foreach(var a in results), можем ли мы через переменную "a" изменять...

пожалуйста, объясните что происходит в каждой строчке программы
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; /*Структура для хранения...

31
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
25.02.2018, 15:15
просто приведите к нужному типу
C#
1
var obj = (TrOperMov.Model.mTrOperMov)constr.Invoke(null);
0
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
25.02.2018, 17:33  [ТС]
Цитата Сообщение от valera_21 Посмотреть сообщение
просто приведите к нужному типу
Просто нужный тип известен в виде строки "TrOperMov.Model.mTrOperMov". Подскажешь как привести?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.02.2018, 17:45
Лучший ответ Сообщение было отмечено _Ramzay как решение

Решение

Цитата Сообщение от _Ramzay Посмотреть сообщение
Т.е. тип объекта object {TrOperMov.Model.mTrOperMov}
Тип объекта и есть TrOperMov.Model.mTrOperMov, а вот тип переменной, в которой хранится ссылка на этот объкет — object.
Не путайте.
1
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,289
25.02.2018, 17:46
Лучший ответ Сообщение было отмечено _Ramzay как решение

Решение

_Ramzay, чтобы можно было привести (точнее: чтобы имело смысл приводить) вам нужно иметь переменную это же типа. Т.е. вам нужно на стадии компиляции знать, с чем вы будете работать. Если вы этого не знаете, то приводить будет бессмысленно.
1
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
26.02.2018, 16:33  [ТС]
Ребята, спасибо за ответы. Теперь понятно, что такое рефлексия. Я получаю не объект, а как бы его отражение, как в зеркале. Полученный объект обладает всеми свойствами оригинала, как две капли воды похож на него. Но это всего лишь отражение. Полученный таким образом объект передается на обработку серверу, а сервер не принимает. Ему подавай оригинал.
0
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
26.02.2018, 16:43
Цитата Сообщение от _Ramzay Посмотреть сообщение
Ему подавай оригинал.
а нельзя объект нужного типа-то создать и его передавать?
з.ы. имею ввиду без рефлексии
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,289
26.02.2018, 16:45
Цитата Сообщение от _Ramzay Посмотреть сообщение
Я получаю не объект, а как бы его отражение, как в зеркале.
Вы сам объект и получаете. Никаких "отражений" зеркальных, что за ерундень?
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.02.2018, 17:56
Цитата Сообщение от _Ramzay Посмотреть сообщение
Теперь понятно, что такое рефлексия. Я получаю не объект, а как бы его отражение
Похоже, что все-таки не понятно
Никаких отражений вы не получаете. Получаете вы самый настоящий, кошерный объект.
0
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
27.02.2018, 07:37  [ТС]
Ну почему точно такой же? Типы у них разные
C#
1
2
3
Имя             Значение                        Тип
obj             {TrOperMov.Model.mTrOperMov}    object {TrOperMov.Model.mTrOperMov}
(mTrOperMov)obj {TrOperMov.Model.mTrOperMov}    TrOperMov.Model.mTrOperMov
Исходный объект имеет тип TrOperMov.Model.mTrOperMov, а полученный объект object {TrOperMov.Model.mTrOperMov}. Как там говорят в Одессе по поводу разницы?
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,289
27.02.2018, 07:43
_Ramzay, где вы разницу увидали? Тут чёрным по белому написано:

object {TrOperMov.Model.mTrOperMov}

Что значит следующее: ссылка типа object указывает на объект типа TrOperMov.Model.mTrOperMov.
0
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
27.02.2018, 07:46  [ТС]
Ну как мне получить мой объект типа TrOperMov.Model.mTrOperMov (зная его тип в виде строки)?
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,289
27.02.2018, 07:47
_Ramzay, вы его и получаете. Просто тип ссылки - object. Поэтому нужно приведение типа, если вам нужно с данным объектом работать напрямую.
0
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
27.02.2018, 07:48  [ТС]
Я получаю ссылку на объект, но не сам объект?
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,289
27.02.2018, 07:51
_Ramzay, в C# вы всегда работаете с ссылочными типами (class) через ссылки. Всегда.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18282 / 14205 / 5368
Регистрация: 17.03.2014
Сообщений: 28,884
Записей в блоге: 1
27.02.2018, 08:05
Цитата Сообщение от _Ramzay Посмотреть сообщение
Ну почему точно такой же? Типы у них разные
Объяснили же уже. Нужно различать тип переменной и тип значения. Простой пример раз все еще непонятно:
C#
1
object obj = "kfjkdjkdfkd";
Тип переменной object. Тип значения string. Отладчик покажет object {string}.
1
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
27.02.2018, 08:06  [ТС]
А что значит ссылка? Например с С++ есть понятие "указатель" (как я понимаю аналог ссылки). Указатель - это просто число, которое указывает на начальный адрес памяти. Получить значение, зная указатель, можно только если известен тип. К указателю прибавляется несколько байт (в зависимости от типа) и получается значение. В C#, по идее, все также, только все более автоматизировано. Но тогда непонятно, если отладчик показывает тип object {TrOperMov.Model.mTrOperMov}, почему нельзя получить значение? Или я что то не так понимаю, Все побежал.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18282 / 14205 / 5368
Регистрация: 17.03.2014
Сообщений: 28,884
Записей в блоге: 1
27.02.2018, 08:07
Цитата Сообщение от _Ramzay Посмотреть сообщение
Полученный таким образом объект передается на обработку серверу, а сервер не принимает. Ему подавай оригинал.
Врядли дело в типе. Скорее состояние объекта (значения полей и свойств) не соответсвуют ожиданиям сервера.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.02.2018, 08:31
Лучший ответ Сообщение было отмечено _Ramzay как решение

Решение

Цитата Сообщение от _Ramzay Посмотреть сообщение
А что значит ссылка?
Значение, через которое можно получить доступ к объекту.
Что-то вроде указателя, но с дополнительными условиями.

Цитата Сообщение от _Ramzay Посмотреть сообщение
Но тогда непонятно, если отладчик показывает тип object {TrOperMov.Model.mTrOperMov}, почему нельзя получить значение?
Потому что на стадии компиляции компилятор понятия не имеет какой тип объекта вы получите во время выполнения. Следовательно, он не может знать, что у полученного объекта будет иметься определенное свойство или метод. В результате он не может скомпилировать приложение.
Присвойте переменной типа object ссылку на любой класс и вы сможете через эту переменную получить доступ только к тем членам, которые имеются в типе object. Вот у вас то же самое.

Начиная с четвертой версии языка вы можете обойти это ограничение с помощью типа dynamic:
C#
1
2
dynamic obj = constr.Invoke(null);
obj.SomeMethod();
Этот код откомпилириуется. Во время выполнения будет запущена урезанная версия компилятора и данный участок перекомпилируется заново (что накладывает свой отпечаток на производительность), но тип переменной obj с dynamic будет заменен на фактический тип объекта, ссылку на который вернул метод Invoke.
Если у данного объекта есть метод SomeMethod, то он будет выполнен, если нет, то приложение упадет.
1
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
27.02.2018, 13:32  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Врядли дело в типе. Скорее состояние объекта (значения полей и свойств) не соответсвуют ожиданиям сервера.
Дело в типе:
C#
1
2
 return Ok((mTrOperMov)obj); // так работает
 return Ok(  obj );          // так не работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2018, 13:32
Помогаю со студенческими работами здесь

Рефлексия: как происходит приведение из object в производные классы и структуры
Объясните пожалуйста, даю кусок кода из книги Шилдта + 1-2 метода дописанных самостоятельно: using System; using System.Reflection;...

Рефлексия. Узнать, что тип свойства наследуется от ViewModelBase
Вот по-быстрому набросал что-то. Я погуглю ещё, почитаю, но мало ли быстрее кто поможет, не хотелось бы на это много времени тратить, если...

Объясните, как происходит создание объекта
Объясните мне идиоту вот например я создаю объект cat Pawel = new cat(); здесь слева создается переменная типа cat имя которой Pawel....

Что здесь происходит?
Подскажите пожалуйста, что происходит в цикле. Так же интересует что такое 0x00000000000000ff for (int i = 8; i > 0;...

Что происходит при A = this
Господа, есть такой вот говнокод using System; class a { public int Value() { return 45; } } class b...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru