2016-04-04 3 views
1

Как получить доступ к доверенному объекту Duck Typed при использовании impromptu-interface. рассмотреть мой код, который показывает мой пример, когда я получаю 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.

+1

Не могли бы вы показать часть документации, которая приведет вас к вере в то, что это должно работать? Здесь есть недоразумение, и эта документация позволяет мне легче объяснить это вам. –

+1

Похоже, вы можете использовать 'Impromptu.UndoActLike (myInterface)', чтобы вернуть исходный (завернутый) объект. –

+0

@PieterWitvoet Это тоже работает, спасибо! – RedStar72

ответ

4

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

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; 
+1

Отличный ответ, протестировал его сейчас, и он отлично работает. Ну, обратно в пруд ... :) – RedStar72

1

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

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