gpt4 book ai didi

c# - 如何将现有对象实例包装到 DispatchProxy 中?

转载 作者:太空狗 更新时间:2023-10-30 01:14:14 25 4
gpt4 key购买 nike

我正在寻找 .NET Core 中的 RealProxy 替代品,这 issue转发我到DispatchProxy .

它有简单的 API,但不清楚如何将现有对象包装到代理中。
例如,具有此接口(interface):

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 等)。

关于c# - 如何将现有对象实例包装到 DispatchProxy 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44922735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com