Создайте динамический прокси для абстрактного класса с внутренним конструктором
Я хотел бы создать динамический прокси для типа в BCL, который является абстрактным классом с внутренним конструктором. Я был динамическим прокси замка, и это не сработало, за исключением того, что нет конструктора без параметров (он есть - он внутренний).
Есть ли способ добиться этого с замком? Если нет, то способны ли другие динамические прокси-серверы это сделать? Это начало разработки, поэтому было бы легко изменить фреймворки.
1 ответ
DynamicProxy не делает ничего, что вы не могли бы сделать вручную в C#. Поэтому он не может наследовать от типов, которые он не может создать, включая типы, у которых нет конструкторов, доступных для DynamicProxy.
Если у вас есть сборка, вы можете предоставить доступ к DynamicProxy через AssemblyInfo.cs, добавив:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
Важно отметить буквальное значение DynamicProxyGenAssembly2
это сборка в памяти, созданная DynamicProxy, и вам необходимо предоставить ей доступ.
Я просто нашел способ добиться этого, не изменяя целевую сборку.
Ключ в том, что TypeBuilder.DefineConstructor
позволяет создать конструктор, не вызывая конструктор базы. Следовательно, можно динамически создать класс FAKE, наследующий исходный класс, с помощью общедоступного конструктора.
Затем просто создайте прокси из поддельного класса. Вы можете записать реальный целевой объект в свойIInterceptor
объект, или в каком-то поле поддельного класса.
Кстати, я использую этот трюк для регистрации ILGenerator.Emit
звонки. Кто-нибудь знает более простые способы разобратьILGenerator.m_ILStream
?