c# - 自动创建一个包装器来实现一个接口(interface)

标签 c# wrapper

我有一些实现特定接口(interface)但在结构上符合该接口(interface)的类。

interface IFoo {
    void method();
}

class Bar {  // does not implement IFoo
   public void method() {...}
}

现在,我可以围绕那些简单地委托(delegate)给包装类的类编写一个包装器

class BarWrapper : IFoo {
   Bar bar = new Bar();
   public void method()
   {
      bar.method();
   }
}

但这是一项繁琐的工作。这些包装类可以以某种方式自动生成吗?像这样的东西:

IFoo foo = CreateWrapper<IFoo>(new Bar());

我确定您可以使用 Reflection.Emit 做到这一点,但我从未使用过它,乍一看它看起来并不容易。

有没有更简单的方法或者是否有一个库已经实现了这个?

最佳答案

您要完成的任务称为鸭式输入。 有一些专门的库可以让你这样做,尽管我没有使用过它们中的任何一个。

只需很少的努力(和一些思考),您就可以使用 CaSTLe Dynamic Proxy 来做到这一点,使用概述的方法 here .

如果出于某种原因,基于拦截器的方法对您来说 Not Acceptable 动态代理不支持开箱即用的方法(目前),但如果您使用 2.2 beta 版,则可以很容易地以强大的方式提供该方法类型化的方式(不使用拦截器),通过提供您自己的代理类型构建器(看看 mixin 是如何实现的)。

关于c# - 自动创建一个包装器来实现一个接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1920222/

相关文章:

python - 在整个磁盘中删除最旧的文件

.net - 从具有不同 GUID 的 .Net 引用 COM+

c# - 如何不混淆Windows窗体中的鼠标单击和鼠标按下事件?

c# - 将 .net 4.0 语法 OfType 转换为 .net 3.5

c# - LINQ to Entities 无法识别方法组连接

c++ - 围绕静态库的托管 C++ 包装器

c# - 是否有更有效的方法来编写使用 DateTime 值的 IF 语句?

c# - 微软机器人框架 : Ask again without restarting dialog

java - 在opencv java包装器中使用方法convertTo

c++ - 在 C++ 中包装不同的 C API 实现