【发布时间】:2013-03-31 07:50:29
【问题描述】:
假设我有一个接口 IFoo
interface IFoo
{
int Bar();
int Bar2();
void VBar();
//etc,
}
我可以创建一个包装器来接受任何 IFoo 对象并在实际调用之前/之后执行一些操作吗?
例如当我做这样的事情时
IFoo wrappedFoo = new Wrapper<IFoo>(actualFooObject).Object;
wrappedFoo.Bar();
那么 wrapper.Bar() 方法实际上会执行类似这样的操作
PreCall(); //some code that I can define in the wrapper
actualFooObject.Bar();
PostCall();
有没有一种简单而干净的方法来做到这一点?
【问题讨论】:
-
Wrapper<IFoo>对我来说没有多大意义,因为您希望能够编写wrapper.Bar()...因此所有这些方法都必须在Wrapper<T>中定义,但它们是 @ 987654329@-特定。在我看来,您需要使IFooWrapper实现IFoo,并对每个接口都这样做。这意味着为所有Bar方法编写相同的Precall(); object.Bar; Postcall(),这并不简单和干净:-) -
@caerolus 你是对的, Wrapper
没有意义。也许我们仍然可以通过为 Wrapper<T>定义T Object { get; }属性来保持通用性,类似于Moq中的mock.Object。 -
@caerolus 更新了问题。谢谢!
-
但是像
IFoo wrappedFoo = new Wrapper<IFoo>(actualFooObject).Object;这样你只是忽略了包装器...wrappedFoo只会指向原始对象!