2016-04-04 3 views
1

Wie erhalte ich Zugriff auf das Proxy-Objekt Duck Typed, wenn impromptu-interface verwendet wird. Sehen Sie meinen Code, dass mein Beispiel zeigt, wo ich eine InvalidCastException, wenn ich versuche, meine Ente typisierte Objekt zum proxied Objekt zu werfen:Zugriff auf Proxy-Objekt über die Impromptu-Schnittstelle

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()); 
     } 
    } 
} 

Ausnahme ist wie folgt:

Eine nicht behandelte Ausnahme des Typs ' System.InvalidCastException‘aufgetreten in ConsoleApplication1.exe

Zusätzliche Informationen: Kann nicht das Objekt vom Typ werfen 'ActLike_IPondBird_c7dd53902ec74f01a3844d4789244ea3' eingeben 'ConsoleApplication1.Duck'.

+1

Können Sie bitte den Teil der Dokumentation zeigen, der Sie glauben lässt, dass dies funktionieren sollte? Es gibt irgendwo ein Missverständnis und die Dokumentation erlaubt es mir, es Ihnen leichter zu erklären. –

+1

Es sieht so aus, als könnten Sie 'Impromptu.UndoActLike (meinInterface)' verwenden, um das ursprüngliche (umgebrochene) Objekt zurück zu bekommen. –

+0

@PieterWitvoet Das funktioniert auch, danke! – RedStar72

Antwort

4

Sie können nicht. Sie können

IPondBird myInterface = Impromptu.ActLike(thing); 

Wie so etwas wie

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

über Linie denken, dass Sie den Verweis auf natives Objekt Teil des Vertrags selbst machen kann gesagt werden - wie:

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

Ausgezeichnete Antwort, testete es jetzt und es funktioniert perfekt. Nun, zurück zum Teich ... :) – RedStar72

1

Wenn Sie Impromptu-Schnittstelle verwenden, der generierte Proxy hat immer eine explizite Schnittstellenimplementierung für IActLikeProxy.

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