Прозрачный прокси для оригинального типа

У меня есть объект времени выполнения типа {System.Runtime.Remoting.Proxies.__TransparentProxy}, который создается из экземпляра класса, который наследуется от ContextBoundObject. Этот класс вызывает событие для какого-то другого объекта, мне нужно преобразовать этот прокси-объект в исходный объект. Все объекты находятся в AppDomain по умолчанию в одной системе.

public abstract class ObjectBase : ContextBoundObject, IObjectBase
{
}

public IMessageSink GetObjectSink(MarshalByRefObject o, IMessageSink next)
        {
            _context = (ObjectBase)o;// as ObjectBase; does not give any error but type remains 
/// transparent proxy in VS watch window.
// no property to get the  underlying type of the proxy
             return _aspect;
        }

Как превратить их в оригинальный объект? Почему прокси создается, если он работает в той же памяти

2 ответа

Вы можете получить RealProxy экземпляр для прозрачного прокси путем вызова MarshalServices.GetRealProxy(), но получить ссылку на объект сервера сложнее, потому что по умолчанию RealProxy только непубличные участники, выставляющие эту ссылку (защищенный метод GetUnwrappedServer() и внутренняя собственность UnwrappedServerObject). Вы можете добраться до тех, кто RealProxy реализуется самостоятельно или с помощью рефлексии (если у вас достаточно доверия для этого).

Вы не должны получать фактическую ссылку на объект, связанный с контекстом. Эван, вы получаете ссылку, используя отражение / внутренний API, вы получите непредвиденное поведение (потому что вы нарушаете правила). Вы можете получить больше информации об объекте контекста, используя Google.

Я думаю, что у вас есть проблема в вашей реальной архитектуре / дизайне. Вы не можете иметь объект, который будет "гибким" и "связанным с контекстом" одновременно. Решение состоит в том, чтобы разделить ваш большой объект на 2 (один контекстный, другой - гибкий) и хранить между ними ссылку (и).

Поэтому, когда вы получаете ссылку "гибкого" (которая наследуется от MArshallByRefObject) в создание AppDomain, вы получаете реальную ссылку на объект, а не прокси. (это определение MarshallByRefObject)

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