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

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

25.02.2018, 15:07. Показов 2334. Ответов 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
Эксперт .NET
 Аватар для Usaga
14796 / 9570 / 1367
Регистрация: 21.01.2016
Сообщений: 36,073
27.02.2018, 13:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _Ramzay Посмотреть сообщение
так не работает
Естественно. Тут нужно приведение, ибо тип ссылки не соответствует тому, что ожидается методом. При этом методу пофигу, что за ссылкой неверного типа стоит совершенно правильный объект, он об этом знать не может и не должен.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18409 / 14340 / 5371
Регистрация: 17.03.2014
Сообщений: 29,029
Записей в блоге: 1
27.02.2018, 13:36
_Ramzay, не работает или не компилируется? Если не работает, то может у Ok разные перегрузки, которые делают разные вещи?
0
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
27.02.2018, 14:08  [ТС]
C#
1
2
3
public class A {public string B {get; set;}}
...
var a=new A();
Это что же получается, переменная a хранит в себе тип объекта A и еще имеет тип переменной (т.е. тип самой себя)? Чему же тогда равен тип переменной в этом случае? Какие бывают типы переменных?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.02.2018, 14:22
Цитата Сообщение от _Ramzay Посмотреть сообщение
Это что же получается, переменная a хранит в себе тип объекта A и еще имеет тип переменной (т.е. тип самой себя)
Переменная а хранит в себе ссылку на экземпляр типа А.

Цитата Сообщение от _Ramzay Посмотреть сообщение
Чему же тогда равен тип переменной в этом случае?
Тип переменной а — А.

Цитата Сообщение от _Ramzay Посмотреть сообщение
Какие бывают типы переменных?
Любые.
Переменная — это хранилище.
В строго типизированных языках, к которым принадлежит и C#, в каждом хранилище может содержаться только определенный тип данных, т.е. у каждой переменной есть один неизменный тип, определяющий что в ней может храниться.
При этом переменные есть двух видов: ссылочные и значимые. В переменных значимых типов хранится непосредственно значение (экземпляр), а в переменных ссылочных типов хранится только ссылка на значение (экземпляр).
1
Эксперт .NET
 Аватар для Usaga
14796 / 9570 / 1367
Регистрация: 21.01.2016
Сообщений: 36,073
27.02.2018, 14:23
_Ramzay, у переменной есть ТИП, переменная может ссылать на объект, который тоже имеет ТИП наследуемый от типа переменной:

C#
1
object a = "Hello";
Тип переменной - object, ссылается на объект типа string, который наследуется от object.

Вариант с var то же, что и выше, но с определением типа силами компилятора.
1
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
27.02.2018, 14:25  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
_Ramzay, не работает или не компилируется? Если не работает, то может у Ok разные перегрузки, которые делают разные вещи?
Компилируется, но не работает. Перезагрузка есть Ok(), но она вообще ничего не возвращает (ошибок не выдает).
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18409 / 14340 / 5371
Регистрация: 17.03.2014
Сообщений: 29,029
Записей в блоге: 1
27.02.2018, 14:27
Цитата Сообщение от _Ramzay Посмотреть сообщение
Перезагрузка есть Ok(), но она вообще ничего не возвращает (ошибок не выдает).
А делают они одно и тоже или все-таки разное?
0
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
27.02.2018, 15:39  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
А делают они одно и тоже или все-таки разное?
Ok() - возвращает пустой положительный ответ, Ok(Model) - возвращает ответ с данными
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18409 / 14340 / 5371
Регистрация: 17.03.2014
Сообщений: 29,029
Записей в блоге: 1
27.02.2018, 15:48
_Ramzay, я имел в виду реализацию методов. Чем она отличается?
0
12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
27.02.2018, 17:02  [ТС]
Если мы пишем
C#
1
object a="ttt";
получаем тип object {string}Я так понимаю что тип переменной "а" (экземпляра объекта object), будет object, но объект хранит в себе значение типа string.
Иными словами a имеет какую-то такую структуру:
C#
1
2
3
4
5
public class object
{
string Type; // тип хранимого значения
string Value; // текстовое представление хранимого значения
}
и наша переменная будет иметь свойства Type="string", Value="ttt"
Если a=1; то Type="int", Value="1"
Если a=new Model(); Model=...; то Type="Model", Value="модель, сериализированая в xml (например)"
и т.д.

Правильно я понимаю смысл термина "тип переменной"?

Добавлено через 35 секунд
Цитата Сообщение от OwenGlendower Посмотреть сообщение
_Ramzay, я имел в виду реализацию методов. Чем она отличается?
реализация мне не ведома
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.02.2018, 17:05
Цитата Сообщение от _Ramzay Посмотреть сообщение
получаем тип object
Надо различать понятия "тип объекта" и "тип ссылки на объект". В вашем случае тип объекта - string, а вот тип ссылки на этот объект - object. Таким образом, с использованием данной ссылки мы можем использовать только те методы, что определены для данного типа (т.е. object, но не string).
1
Эксперт .NET
 Аватар для Usaga
14796 / 9570 / 1367
Регистрация: 21.01.2016
Сообщений: 36,073
27.02.2018, 17:34
Цитата Сообщение от _Ramzay Посмотреть сообщение
Правильно я понимаю смысл термина "тип переменной"?
Вообще ниразу.

Тип ссылки - тип, на который ссылке разрешено указывать. А тип самого объекта к ссылке особого отношения не имеет, так как может вообще не быть ссылки (объект готов к сборке мусора). Строка (string) - это объект (object), поэтому ссылка типа object может ссылаться на строку (да и вообще на любой объект).

Технически, ссылка - указатель, просто 4 или 8 байт с адресом объекта. Ссылка не обладает какой-то метаинформацией или чем-то таким. За её использованием следит компилятор и CLR.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2018, 17:34

Рефлексия: как происходит приведение из 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...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru