Как реализовать в 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 шт):
Порылся рефлектором в стандартной библиотеке и быстро нашёл ответ сам. Чтобы реализовать желаемое поведение, необходимо реализовать в классе прокси интерфейс System.Runtime.Remoting.IRemotingTypeInfo и в методе CanCastTo проверять, какой интерфейс запрошен, через первый параметр. Также там можно увидеть, что в стандартной библиотеке метод GetTransparentProxy не переопределён ни в том прокси, который используется в .NET Remoting, ни в том прокси, который используется в WCF.