Как получить доступ к прокси-объекту с помощью импровизированного интерфейса
Как я могу получить доступ к прокси-объекту 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;