Как получить доступ к прокси-объекту с помощью импровизированного интерфейса

Как я могу получить доступ к прокси-объекту Duck Typed при использовании импровизированного интерфейса. рассмотрим мой код, который иллюстрирует мой пример, где я получаю InvalidCastException когда я пытаюсь привести свой типизированный объект к прокси-объекту:

using System;
using ImpromptuInterface;

namespace ConsoleApplication1
{
    public class Duck
    {
        public string Says { get; set; }

        public int GetNumberOfQuacksPerMinute()
        {
            return 42;
        }
    }

    public interface IPondBird
    {
        string Says { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Duck says Quack! Quack!! Quack!!!
            var thing = new Duck { Says = "Quack! Quack!! Quack!!!" };

            IPondBird myInterface = Impromptu.ActLike(thing);

            // ...

            // Later on, I want to get access to a proxied object, but I 
            // get a InvalidCastException here
            Duck proxiedObject = (Duck) myInterface;
            Console.WriteLine("Duck # quacks per minute: " 
                + proxiedObject.GetNumberOfQuacksPerMinute());
        }
    }
}

Исключением является следующее:

Произошло необработанное исключение типа "System.InvalidCastException" в ConsoleApplication1.exe.

Дополнительная информация: Невозможно привести объект типа 'ActLike_IPondBird_c7dd53902ec74f01a3844d4789244ea3' к типу 'ConsoleApplication1.Duck'.

2 ответа

Решение

Ты не можешь Вы можете думать о линии

IPondBird myInterface = Impromptu.ActLike(thing);

Как-то вроде

public class Wrapper : IPondBird 
{
  public Wrapper(Duck duck) { ... }
}
IPondBird myInterface = new Wrapper(thing);

При этом вы можете сделать ссылку на нативный объект частью самого контракта, например:

public interface IPondBird
{
    string Says { get; set; }
    object NativeObject { get; }
}

public class Duck
{
    public string Says { get; set; }

    public int GetNumberOfQuacksPerMinute()
    {
        return 42;
    }

    public object NativeObject { get { return this; } }
}

IPondBird myInterface = Impromptu.ActLike(thing);   
var duck = (Duck)myInterface.NativeObject;

Когда вы используете импровизированный интерфейс, сгенерированный прокси всегда имеет явную реализацию интерфейса для IActLikeProxy,

IPondBird myInterface = Impromptu.ActLike(thing);   
var duck = (Duck)((IActLikeProxy)myInterface).Original;
Другие вопросы по тегам