我有一个实现接口A
的类IA
:
class A : IA
{
f(){...}
}
我想使用一个新的A
包裹WrapA
来实现IA
,并打算通过调用其中的每个函数来包装A
一项新任务:
class WrapA : IA
{
private A;
f()
{
StartInNewTask(A.f());
}
}
当然,这很容易手动完成。
但我想要一个自动机制来进行这种包装,类似于模拟界面的模拟。
如果在我希望看到一个例子之前完成,或者有任何关于如何实现它的想法。
答案 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>();
}
}