微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我该如何创建一个代理对象来转发c#中的方法调用?

如何解决我该如何创建一个代理对象来转发c#中的方法调用?

| 我正在尝试使用硒来运行测试;似乎没有一种好方法可以在多个浏览器上运行同一组单元测试。 我阅读了有关并行运行测试的文章: 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来映射参数,或者传递了一个采用要调用方法名称函数,但是这些似乎都是la脚的主意。 我真正想要的是添加一个成员,例如:
public class SeleniumProxy {
    public dynamic proxy;
    ....
}
并像这样调用
var selenium = getProxy();
selenium.proxy.Open(\"...\");
c#是否允许动态对象使用这种语法? 还是某种类的元处理程序,使它们能够捕获此类方法异常并手动处理? 基本上: 如何创建一个可动态调用类内部成员方法的代理对象? (编辑:也许...在DefaultSelenium对象上使用反射,并在动态代理对象上为每个条目创建函数存根。)     

解决方法

        如果我了解您的尝试,我认为您可以扩展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
    }
}
“ 4”将成为一些代码,该代码使用“ 5”作为查找过程的一部分(通过反射,大概是在戳)其他对象的内部成员。 如果您需要包装简单方法调用的任何高级方法,可以覆盖
TryGetMember
TryGetIndex
方法。 构造后,您将必须将
Proxy
的实例转换为
dynamic
的实例以进行任意调用,就像处理ExpandoObject一样。     ,        您可以利用继承,并使用工厂方法在抽象基类中定义测试以创建selenium实例,然后为要建模的每种浏览器继承该实例。然后,将使用适当的浏览器为每个继承的类运行测试。以NUnit为例:
public abstract class AbstractTests
{
    protected abstract DefaultSelenium CreateSelenium();

    [Test]
    public void TestSomethingA()
    {
        DefaulSelenium selenium = CreateSelenium();

        //Do some testing with selenium.
    }
}

[TestFixture]
public class IETests : AbstractTests
{
    protected override DefaultSelenium CreateSelenium()
    {
        return new DefaultSelenium(\"iexplore\");
    }
}

[TestFixture]
public class FirefoxTests : AbstractTests
{
    protected override DefaultSelenium CreateSelenium()
    {
        return new DefaultSelenium(\"firefox\");
    }
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。