如何使用即兴接口访问代理对象
How to access proxied object using impromptu-interface
如何在使用 impromptu-interface 时访问 Duck Typed 代理对象。考虑一下我的示例代码,当我尝试将 Duck Typed Object 转换为代理对象时,我得到一个 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());
}
}
}
异常情况如下:
An unhandled exception of type 'System.InvalidCastException' occurred
in ConsoleApplication1.exe
Additional information: Unable to cast object of type
'ActLike_IPondBird_c7dd53902ec74f01a3844d4789244ea3' to type
'ConsoleApplication1.Duck'.
你不能。你可以考虑line
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;
如何在使用 impromptu-interface 时访问 Duck Typed 代理对象。考虑一下我的示例代码,当我尝试将 Duck Typed Object 转换为代理对象时,我得到一个 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());
}
}
}
异常情况如下:
An unhandled exception of type 'System.InvalidCastException' occurred in ConsoleApplication1.exe
Additional information: Unable to cast object of type 'ActLike_IPondBird_c7dd53902ec74f01a3844d4789244ea3' to type 'ConsoleApplication1.Duck'.
你不能。你可以考虑line
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;