12 / 11 / 1
Регистрация: 20.01.2018
Сообщений: 76
.NET 4.x

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

25.02.2018, 15:07. Показов 2254. Ответов 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
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
27.02.2018, 13:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _Ramzay Посмотреть сообщение
так не работает
Естественно. Тут нужно приведение, ибо тип ссылки не соответствует тому, что ожидается методом. При этом методу пофигу, что за ссылкой неверного типа стоит совершенно правильный объект, он об этом знать не может и не должен.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18365 / 14296 / 5370
Регистрация: 17.03.2014
Сообщений: 28,980
Записей в блоге: 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
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
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
18365 / 14296 / 5370
Регистрация: 17.03.2014
Сообщений: 28,980
Записей в блоге: 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
18365 / 14296 / 5370
Регистрация: 17.03.2014
Сообщений: 28,980
Записей в блоге: 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
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru