Непонятная штука с reflection
От: fspirit Россия  
Дата: 19.09.05 11:44
Оценка:
Загружаю сборку, нахожу там тип PACreator, по GetType("PACreator"). Тип найден. Теперь пытаюсь создать объект этого типа (PACreator) Activator.CreateInstance(type), где type, то, что вернул GetType. Exception: Type cast is not valid. Объясните, пожалуйста, в чем дело?
Re: Непонятная штука с reflection
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.09.05 11:52
Оценка: 1 (1)
Здравствуйте, fspirit, Вы писали:

F>Загружаю сборку, нахожу там тип PACreator, по GetType("PACreator"). Тип найден. Теперь пытаюсь создать объект этого типа (PACreator) Activator.CreateInstance(type), где type, то, что вернул GetType. Exception: Type cast is not valid. Объясните, пожалуйста, в чем дело?


А какой смысл создавать через Activator.CreateInstance известный тип? Если тип известен, создавай его через new. В обратом случае ты просто не сможешь его привести, так как тип будет тебе не доступен.

Если тебе нужно иметь возможность загружать некоторый тип извне и использовать его без динамических вызовов, то у тебя есть два пути.
1. Подключиться к нужным методам через делегаты.
2. Описать в своей сборке интерфейс, подключить ссылку на эту сборку в ту сборку которая будет загружаться динамически и при создании экземляра класса из динамической сборки приводить его к типу этого интерфейса.

Вот здесь можно найти пример где динамически создается сборка. Для связи с ней там как раз используется интерфейс.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Непонятная штука с reflection
От: Gary Земля  
Дата: 19.09.05 11:54
Оценка: +1
Здравствуйте, fspirit, Вы писали:

F>Загружаю сборку, нахожу там тип PACreator, по GetType("PACreator"). Тип найден. Теперь пытаюсь создать объект этого типа (PACreator) Activator.CreateInstance(type), где type, то, что вернул GetType. Exception: Type cast is not valid. Объясните, пожалуйста, в чем дело?


1. А может, конструктор по умолчанию требует параметров?
2. Activator.CreateInstance возвращает Object
А так:
Object AnObject;
PACreator ACreator;
AnObject = Activator.CreateInstance(AType, new object[],{});
ACreator = (PACreator)AnObject;
Re[2]: Непонятная штука с reflection
От: fspirit Россия  
Дата: 19.09.05 12:06
Оценка:
VD>А какой смысл создавать через Activator.CreateInstance известный тип? Если тип известен, создавай его через new. В обратом случае ты просто не сможешь его привести, так как тип будет тебе не доступен.

Ну, это я уже отчаился, когда не мог привести к базовому абстрактному типу и решил проверить конкретный.

VD>Если тебе нужно иметь возможность загружать некоторый тип извне и использовать его без динамических вызовов, то у тебя есть два пути.

VD>1. Подключиться к нужным методам через делегаты.
VD>2. Описать в своей сборке интерфейс, подключить ссылку на эту сборку в ту сборку которая будет загружаться динамически и при создании экземляра класса из динамической сборки приводить его к типу этого интерфейса.

Все-таки мне непонятно, почему вынужден приводить его к интерфейсу. Как-то это нелогично.

VD>Вот здесь можно найти пример где динамически создается сборка. Для связи с ней там как раз используется интерфейс.

Спасибо.
Re[3]: Непонятная штука с reflection
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.09.05 12:16
Оценка: 1 (1)
Здравствуйте, fspirit, Вы писали:

F>Ну, это я уже отчаился, когда не мог привести к базовому абстрактному типу и решил проверить конкретный.


Тогад лучше опиши проблему (исходную) и скорее всего решение окажется куда проще.

F>Все-таки мне непонятно, почему вынужден приводить его к интерфейсу. Как-то это нелогично.


Создаваемый тип определен в сборке неизвестной на момент компиляции. Логично? Значит мы не можем использовать его из программного кода исходной борки. Тоже вроде логчно...

Но мы можем описать в исходной сборке тип который можно реализовать в динамической сборке. Так? Ну, вот мы и экспортируем тип в динамическую сборку где его успешно реализуем. Далее по имени создаем экземпляр класса из динамической сборки. При этом он возвращается как object. С object-ом мы можем работать только чрезе рефлексию. Привести object к типу из динамической сборки мы не можем, но мы можем привести object и нашему интерфейсу, ведь он известен в исходной сборке и реализован в созданном нами классе. Вот мы это и делаем. Ну, а дальше работаем с интерфейсом полиморфно (нам ведь все равно кто его раелизует!).
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Непонятная штука с reflection
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 21.09.05 08:17
Оценка:
Здравствуйте, fspirit, Вы писали:

F>Загружаю сборку, нахожу там тип PACreator, по GetType("PACreator"). Тип найден. Теперь пытаюсь создать объект этого типа (PACreator) Activator.CreateInstance(type), где type, то, что вернул GetType. Exception: Type cast is not valid. Объясните, пожалуйста, в чем дело?


Ты два раза загрузил одну сборку. Один раз автоматически, поскольку сослался внутри кода на тип PACreator, второй раз ручками. Ну а типы в разных сборках конечно же несовместимы.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.