2008-09-16 5 views
0

На некоторых языках вы можете переопределить ключевое слово «новое», чтобы контролировать, как создаются типы. Вы не можете сделать это прямо в .NET. Тем не менее, мне было интересно, есть ли способ, скажем, обработать исключение «Тип не найден» и вручную разрешить тип до того, кто «новый» поднимет этот тип взрывов?Могу ли я изменить способ разрешения и создания экземпляров в .NET?

Я использую сериализатор, который читает в XML-файле и создает экземпляры, описанные в нем. У меня нет никакого контроля над сериализатором, но я хотел бы взаимодействовать с процессом, надеюсь, без написания собственного хоста appdomain.

Просьба не предлагать альтернативные методы сериализации.

ответ

5

Вы можете подключить обработчик событий к AppDomain.CurrentDomain.AssemblyResolve, чтобы принять участие в этом процессе.

Ваш EventHandler должен вернуть сборку, отвечающую за тип, переданный в ResolveEventArgs.

Вы можете прочитать об этом в MSDN

+0

Примечание: это проблематично для моно. – leppie 2008-10-12 07:17:36

-1

Вы должны проверить класс Reflection и Activator. Они позволят вам создавать объекты из строк. Конечно, объект должен находиться в одной из сборок, к которым у вас есть доступ.

1

select isn't broken обсуждает, как смотреть на него по-другому - ошибка может быть в вашем дизайне не вашей инструментальной.

Я думаю, что попытка получить «новое», чтобы сделать что-то еще, будет неправильным подходом.

Подумайте, почему перегрузка оператора должна использоваться с осторожностью - это противоречит интуиции и трудно отлаживается при скрытых изменениях в семантике языка.

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

+0

Я думаю, что он более изящный, чтобы помочь процессу, чем идти и загружать каждую сборку фрегата, которую я нахожу, слепо, в надежде получить тот тип, который мне нужен, прежде чем десериализация взрывается. – Will 2008-09-17 12:48:09