我正在寻找.NET Core中的RealProxy
替换,并且此issue将我转发到 DispatchProxy
。
它具有简单的API,但尚不清楚如何将现有对象包装到代理中。
例如,具有以下界面:
interface IFoo
{
string Bar(int boo);
}
和此实现:
class FooImpl : IFoo
{
public string Bar(int boo)
{
return $"Value {boo} was passed";
}
}
如何得到我想要的?
class Program
{
static void Main(string[] args)
{
var fooInstance = new FooImpl();
var proxy = DispatchProxy.Create<IFoo, FooProxy>();
var s = proxy.Bar(123);
Console.WriteLine(s);
}
}
class FooProxy : DispatchProxy
{
protected override object Invoke(MethodInfo targetMethod, object[] args)
{
return targetMethod.Invoke(/* I need fooInstance here */, args);
}
}
由于
DispatchProxy
后代必须具有无参数构造函数,所以我唯一的想法就是发明一些方法,如下所示:class FooProxy : DispatchProxy
{
private object target;
public void SetTarget(object target)
{
this.target = target;
}
protected override object Invoke(MethodInfo targetMethod, object[] args)
{
return targetMethod.Invoke(target, args);
}
}
并以这种方式使用它:
var fooInstance = new FooImpl();
var proxy = DispatchProxy.Create<IFoo, FooProxy>();
((FooProxy)proxy).SetTarget(fooInstance);
// the rest of code...
这是正确的方法吗?
最佳答案
没错,这里没有其他选择,只能将生成的IFoo
转换为已知的代理类型(FooProxy
),并在FooProxy
上使用自定义方法或属性。没有公共(public)API可以添加构造函数参数或将代理返回为实现类型。但是,DispatchProxy.Create()
将返回FooProxy
子类的实例,该子类的类型在运行时通过反射和IL发射生成。
如果您正在寻找其他快速包装实现并替换接口(interface)方法/虚拟方法的方法,则建议改用模拟框架(FakeItEasy,Moq,NSubstitute等)。