Создайте динамический прокси для абстрактного класса с внутренним конструктором

Я хотел бы создать динамический прокси для типа в BCL, который является абстрактным классом с внутренним конструктором. Я был динамическим прокси замка, и это не сработало, за исключением того, что нет конструктора без параметров (он есть - он внутренний).

Есть ли способ добиться этого с замком? Если нет, то способны ли другие динамические прокси-серверы это сделать? Это начало разработки, поэтому было бы легко изменить фреймворки.

1 ответ

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


Если у вас есть сборка, вы можете предоставить доступ к DynamicProxy через AssemblyInfo.cs, добавив:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

Важно отметить буквальное значение DynamicProxyGenAssembly2 это сборка в памяти, созданная DynamicProxy, и вам необходимо предоставить ей доступ.

Я просто нашел способ добиться этого, не изменяя целевую сборку.

Ключ в том, что TypeBuilder.DefineConstructorпозволяет создать конструктор, не вызывая конструктор базы. Следовательно, можно динамически создать класс FAKE, наследующий исходный класс, с помощью общедоступного конструктора.

Затем просто создайте прокси из поддельного класса. Вы можете записать реальный целевой объект в свойIInterceptor объект, или в каком-то поле поддельного класса.

Кстати, я использую этот трюк для регистрации ILGenerator.Emitзвонки. Кто-нибудь знает более простые способы разобратьILGenerator.m_ILStream?

Другие вопросы по тегам