自动实现包装现有实现的接口

时间:2015-03-31 06:44:20

标签: c# interface .net-4.0 mocking implements

我有一个实现接口A的类IA

class A : IA
{
   f(){...}
}

我想使用一个新的A包裹WrapA来实现IA,并打算通过调用其中的每个函数来包装A一项新任务:

class WrapA : IA
{
  private A;
  f()
  {
    StartInNewTask(A.f());
  }
}

当然,这很容易手动完成。

但我想要一个自动机制来进行这种包装,类似于模拟界面的模拟。

如果在我希望看到一个例子之前完成,或者有任何关于如何实现它的想法。

2 个答案:

答案 0 :(得分:1)

要实现这一点,您可以使用CodeDOM,一种动态创建代码的技术。您以面向对象的方式构造命名空间/类。有关详细文档,请参阅MSDN CodeDOM

在您的情况下,您需要使用Type.GetMethods - 方法读取要通过反射包装的方法。因此,您使用CodeMethodInvokeExpression访问目标方法。 您需要引用包装对象,您可以使用CodeVariableReferenceExpression访问该对象。有了它,您可以使用CodeMethodInvokeExpression来调用Task.Run() - 方法(或您使用的任何方法)并提供Delegate和对目标对象的引用。

这是一个复杂的主题,因此您需要阅读一些文档,但由于它是Microsoft技术,因此它具有很好的文档功能。一旦你阅读了它,实现你的包装就会很容易。

答案 1 :(得分:0)

我发现最好的框架是Unity的拦截器。

由于我已经使用过Unity Bootstrapper,因此很容易集成。

https://msdn.microsoft.com/en-us/library/dn178466%28v=pandp.30%29.aspx

实现(简化后,你需要注意返回值):

public class RestPerformanceInterceptor : IInterceptionBehavior
{
    public bool WillExecute { get { return true; } }

    public IEnumerable<Type> GetRequiredInterfaces()
    {
        return new[] { typeof(IA) };
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
        var behaviorDelegate = getNext();

        StartInNewTask(behaviorDelegate.Invoke(input, getNext));

        return new Mock<IMethodReturn>();
    }
}