我见过这样的例子,其中一个接口被提供给工厂,它生成实现接口的对象。这对我来说并不复杂,但我没有得到的是如何使用它来实现行为。
以WCF中的ChannelFactory为例......当您从接口生成通道时,它会公开调用远程过程时的方法(来自接口)。我似乎在如何做到这一点上有一点差距。这可能是一种常见的设计模式,但我认为我再次使用SO作为研究扩展。
答案 0 :(得分:1)
模拟接口的模拟框架会生成实现接口的动态类。模拟方法的行为将取决于框架。通常,除非通过模拟提供实现,否则该方法将不执行任何操作。
例如:
Mock<IRepository> repMock = new Mock<IRepository>();
repMock.Setup(r => r.FindById(1)).Returns(new MyObject());
假设IRepository
接口定义了FindByID
方法,模拟的Setup
方法动态生成方法的实现并将其“注入”到mock中。这是使用Reflection.Emit
完成的,它可用于动态构建IL指令并动态编译它们。
答案 1 :(得分:1)
通常通过代码发出来实现。请参阅System.Reflection.Emit中的类。
例如,你可以获得一个接口Type并查看它声明的方法,然后使用TypeBuilder构建你自己的继承它的类型,并在方法中实现你想要的任何功能(或者只是它们为空/做一个返回默认值(T),使用MethodBuilder等,直到您对接口满意为止。