57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
|
|
1 | |
Type.MakeGenericType11.09.2015, 00:54. Показов 2721. Ответов 10
Метки reflection (Все метки)
Доброго времени суток. Если можете, поясните пожалуйста на пальцах как работает этот метод. Читал несколько туториалов - пока трудновато въехать. Спасибо.
0
|
11.09.2015, 00:54 | |
Ответы с готовыми решениями:
10
Реализовать метод string[] Method(Type type), который будет выводить все члены, видимые вне сборки, помеченные атрибута Ошибка: The conversion of a varchar data type to a datetime data type resulted in an out-of-range value Оператор "*" не может применяться к операндам типа "type" и "type" Десериализация XML с xsi:type |
Заблокирован
|
|
11.09.2015, 01:06 | 2 |
и где этот метод? тут все натыкано уже
0
|
Администратор
|
||||||
11.09.2015, 07:45 | 3 | |||||
KrekerOK, с помощью MakeGenericType можно подставить недостающие тип-аргументы в обобщенный тип чтобы он стал конкретным обобщенным типом чтобы его можно было сконструировать.
0
|
11.09.2015, 08:30 | 4 | |||||
Создание контрола с <T>
0
|
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
|
||||||||||||||||
11.09.2015, 10:03 [ТС] | 5 | |||||||||||||||
Спасибо, становится немного ясней, но пока на практике не могу использовать. Например есть такой код:
Рефлексией получаю тип TargetModel. Далее:
Добавлено через 4 минуты Если сделать приведение типов
Можно ли добиться того же эффекта не указывая явное приведение типов? Добавлено через 6 минут Без приведения типов и свойства недоступны (они просто показывались в дебагере). То есть получается, что Activaor возвращает object.
0
|
Администратор
|
||||||
11.09.2015, 10:07 | 6 | |||||
Ты что-то путаешь. Переменная myObject имеет тип object и соответственно на ней будут доступны только члены System.Object.
Можно с помощью рефлексии, но это будет некрасиво. Плюс ты зачем-то добавил тип аргумент у MeMethod что означает что для него нужно будет вызвать MakeGenericMethod.
Отладчик и среда исполнения всегда знают настоящий тип значения. Разумеется. Для этого достаточно посмотреть справку или подсказку IntelliSense.
0
|
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
|
|
11.09.2015, 10:22 [ТС] | 7 |
Да, я уже понял что путаю. Дело в том, что я смотрел в дебагере, а там свойства как бы видимые, но в реальности их они не доступны. По идеи метод может быть и обычным. А как сделать приведение с помощью рефлексии?
0
|
Администратор
|
|
11.09.2015, 10:30 | 8 |
KrekerOK, "динамическое" приведение здесь не поможет т.к. для обращения к членам SomeModel<T> тебе нужно иметь переменную этого типа на этапе компиляции. Или оставить переменную типа object и обращаться к нужным членам с помощью рефлексии уже на этапе выполнения.
Что именно ты пытаешься сделать? Зачем конструировать SomeModel<T> с помощью рефлексии?
0
|
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
|
|||||||||||||||||||||
11.09.2015, 10:56 [ТС] | 9 | ||||||||||||||||||||
Опишу ситуацию вкратце. Есть базовый интерфейс IMyBaseInterface. Его реализуют несколько классов (5,10,15...не важно). Есть хранилище в котором хранятся имена этих классов (можно вручную забивать, можно каждый раз обновлять с помощью рефлексии). В программу поступает строка - название класса, задача программы состоит в том чтобы создать экземпляр этого класса. Для этого я решил завести словарик (тип значения - делегат типа базового интерфейса) в который при старте программы я собираю все классы с их методами которые возвращают экземпляр класса (CreateInstance). CreateInstance возвращает IMyBaseInterface. В интерфейсе IMyBaseInterface есть метод ExecuteOperation ,на данном этапе он представляет собою switch который какой void метод выполнить (список метод также есть в хранилище). В будущем также планирую переделать на рефлексию.
Для того чтобы заполнить мой словарик - я почему то начал рыть в сторону Generic, но оказалось не то (хотя может быть и с помощью Generic также можно это реализовать). Оказалось всё немного проще:
Ну и в каждом классе которые реализует IBaseTestInterface есть соответственный метод:
Цель всех этих лишних телодвижений - улучшить масштабируемость системы и убрать из программы switch типа
0
|
Администратор
|
|
11.09.2015, 11:05 | 10 |
KrekerOK, ты немного перемудрил. Раз все типы реализуют общий интерфейс, то приводи то что вернул Activator.CreateInstance к IBaseTestObject и вызывай метод SpecialMethod.
0
|
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
|
||||||
11.09.2015, 11:11 [ТС] | 11 | |||||
Ну по сути я так и делаю, просто вместо того чтобы каждый раз узнавать рефлексией объект, я создаю словарь с методами всех объектов, и определю ещё один метод который будет принимать строку, делать поиск по словарю и выполнять соответствующий метод для создания объекта.
Добавлено через 2 минуты Что то вроде этого:
0
|
11.09.2015, 11:11 | |
11.09.2015, 11:11 | |
Помогаю со студенческими работами здесь
11
Type.GetType вместо typeof() Нужно из Type получить class Cannot implicitly convert type 'object' to 'string' Получить Type компонента по его имени Инициализация generic классов используя System.Type Type or namespace definition, or end-of-file expected Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |