Re: [Этюд] Объект-хамелеон
От: TK Лес кывт.рф
Дата: 29.08.11 09:25
Оценка: 117 (7) +1
Здравствуйте, nikov, Вы писали:

N>Создать объект, который можно успешно привести к любому интерфейсу, и который при вызове у него любого метода любого интерфейса выводит название этого метода на консоль.


N>
N>var x = CreateChameleonObject();
N>((ICloneable)x).Clone(); // Prints "Clone"
N>((IDisposable)x).Dispose(); // Prints "Dispose"
N>// ...
N>



    class TestObject : MarshalByRefObject
    {
    }

    class TextObjectProxy : RealProxy, IRemotingTypeInfo
    {
        public TextObjectProxy() : base(typeof(TestObject))
        {
        }

        public bool CanCastTo(Type fromType, object o)
        {
            return true;
        }

        public override IMessage Invoke(IMessage msg)
        {
            IMethodCallMessage mcm = (IMethodCallMessage)msg;
            Console.WriteLine(mcm.MethodName);

            return new MethodResponse(null, mcm);
        }


        public string TypeName
        {
            get
            {
                return typeof(TestObject).FullName;
            }
            set { }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var proxy = new TextObjectProxy();
            var x = (TestObject)proxy.GetTransparentProxy();

            ((ICloneable)x).Clone(); // Prints "Clone"
            ((IDisposable)x).Dispose(); // Prints "Dispose"
            ((IDisposable)(ICloneable)x).Dispose(); // Prints "Dispose"
        }
    }
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.