Как реализовать в TransparentProxy дополнительные интерфейсы?

Я разбираюсь с тем, как писать прокси, и столкнулся со следующей проблемой.

Объявление класса прокси:

public class TestProxy<T> : RealProxy
{
    public TestProxy() : base(typeof(T)) { }
/* ... */
}

Дальше я перекрываю в нём метод Invoke, возвращаю оттуда объект класса ReturnMessage, там всё понятно и удобно.

Использование прокси:

ICaller caller = (ICaller)(new TestProxy<ICaller>()).GetTransparentProxy();

После этого я могу вызывать методы интерфейса ICaller, всё работает адекватно.

Но дальше мне нужно, чтобы полученный TransparentProxy мог реализовывать интерфейсы, отличные от того, который я передал в качестве generic-параметра классу TestProxy. В данном случае, не только ICaller. По идее, метод GetTransparentProxy виртуальный, и, наверное, надо что-то сделать при его переопределении. Но в документации у Microsoft не сказано, как его правильно переопределять.


Ответы (1 шт):

Автор решения: Modus

Порылся рефлектором в стандартной библиотеке и быстро нашёл ответ сам. Чтобы реализовать желаемое поведение, необходимо реализовать в классе прокси интерфейс System.Runtime.Remoting.IRemotingTypeInfo и в методе CanCastTo проверять, какой интерфейс запрошен, через первый параметр. Также там можно увидеть, что в стандартной библиотеке метод GetTransparentProxy не переопределён ни в том прокси, который используется в .NET Remoting, ни в том прокси, который используется в WCF.

→ Ссылка