2016-04-04 34 views
1

如何在使用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;