gpt4 book ai didi

c# - 如何在 C# 中创建转发方法调用的代理对象?

转载 作者:行者123 更新时间:2023-11-30 18:41:49 26 4
gpt4 key购买 nike

我正在尝试使用 selenium 来运行测试;似乎没有在多个浏览器上运行同一组单元测试的好方法。

我阅读了这篇关于并行运行测试的帖子: http://slmoloch.blogspot.com/2009/12/design-of-selenium-tests-for-aspnet_19.html

但是,我使用的是 visual studio 单元测试框架。

我可以像这样创建一个代理类:

public class SeleniumProxy {
private List<DefaultSelenium> targets;
public SeleniumProxy() {
targets = new List<DefaultSelenium>();
targets.Add(new DefaultSelenium(... "firefox"...));
targets.Add(new DefaultSelenium(... "iexplore"...));
}
public void Open(String url) {
foreach (var i in targets) {
i.Open(url);
}
}
...
}

我的问题是?我怎样才能做到这一点而不必将整个类重写为代理?

我想也许可以将一个 lamda 传递给映射参数,或者传递一个函数,该函数采用要调用的方法的名称,但这些想法看起来都很蹩脚。

我真正想要的是添加一个成员,例如:

public class SeleniumProxy {
public dynamic proxy;
....
}

然后这样调用:

var selenium = getProxy();
selenium.proxy.Open("...");

c# 是否允许动态对象使用这种语法?

或者某种类的元处理程序,让它们捕获非此类方法异常并手动处理它们?

基本上:我如何创建一个代理对象来动态调用类的内部成员的方法?

(编辑:也许……在 DefaultSelenium 对象上使用反射并在动态代理对象上为每个条目创建函数 stub ……?)

最佳答案

如果我理解您的尝试,我认为您可以扩展 DynamicObject实现这一目标。

class Proxy : System.Dynamic.DynamicObject
{
public Proxy(object someWrappedObject) { ... }

public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
{
// Do whatever, binder.Name will be the called method name
}
}

//Do whatever... 将成为一些代码,使用 binder.Name 作为一部分来戳其他对象的内部成员(大概是通过反射)查找过程。

如果您需要包装简单方法调用的任何更高级的内容,可以覆盖 TryGetMemberTryGetIndex 方法。

您必须在构造后将 Proxy 的实例转换为 dynamic 以进行任意调用,就像处理 ExpandoObject 时一样.

关于c# - 如何在 C# 中创建转发方法调用的代理对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6327290/

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