我有一些类没有实现某个接口,但在结构上符合该接口.
interface IFoo {
void method();
}
class Bar { // does not implement IFoo
public void method() {...}
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以围绕那些简单地委托给包装类的类编写一个包装器
class BarWrapper : IFoo {
Bar bar = new Bar();
public void method()
{
bar.method();
}
}
Run Code Online (Sandbox Code Playgroud)
但那是很多繁琐的工作.那些包装类可以自动生成吗?就像是:
IFoo foo = CreateWrapper<IFoo>(new Bar());
我相信你可以用Reflection.Emit做到这一点,但我从来没有用过它,乍一看它看起来并不容易.
有没有更简单的方法,或者是否有一个库已经实现了这个?
如果您想要轻松简单的Duck打字支持,您还可以查看:Duck Typing项目.它适用于.Net 2.0及更新版本.
用法示例(摘自David Meyer的网站):
public interface ICanAdd
{
int Add(int x, int y);
}
// Note that MyAdder does NOT implement ICanAdd,
// but it does define an Add method like the one in ICanAdd:
public class MyAdder
{
public int Add(int x, int y)
{
return x + y;
}
}
public class Program
{
void Main()
{
MyAdder myAdder = new MyAdder();
// Even though ICanAdd is not implemented by MyAdder,
// we can duck cast it because it implements all the members:
ICanAdd adder = DuckTyping.Cast<ICanAdd>(myAdder);
// Now we can call adder as you would any ICanAdd object.
// Transparently, this call is being forwarded to myAdder.
int sum = adder.Add(2, 2);
}
}
Run Code Online (Sandbox Code Playgroud)
使用扩展方法,您可以将其简化为类似这样的东西(类似于Bart De Smet的语法)
MyAdder myAdder = new MyAdder(); // this doesn't implement the interface
ICanAdd adder = myAdder.AsIf<ICanAdd>(); // but it quacks like a duck
int sum = adder.Add(2, 2);
Run Code Online (Sandbox Code Playgroud)
你可以创建一个新类
class SubBar : IFoo, Bar {
}
Run Code Online (Sandbox Code Playgroud)
并实例化它(假设Bar确实具有 ducktype,即确切的IFoo方法)。
您可能想看看 Castle Project 的DynamicProxy。这就是Rhino.Mocks用于其类型代理的方式。
我自己没有使用过它,所以我不知道你需要付出多少努力,但我怀疑这是一个很好的起点。
| 归档时间: |
|
| 查看次数: |
8030 次 |
| 最近记录: |