C#装饰器类使用方法的默认类版本

时间:2016-08-15 17:30:35

标签: c# design-patterns webdriver decorator

如果尝试装饰类,如何使方法与默认实现相同?

例如,我正在尝试将属性添加到WebDriver类的IWebDriver接口。

public class MyWebDriver : IWebDriver
{
    private IWebDriver _driver;
    internal string _currentTest { get; set; }

    internal MyWebDriver(IWebDriver driver)
    {
        _driver = driver;
    }
}

Visual Studio IntelliSense让我使用一堆'throw new NotImplementedException();作为默认WebDriver类方法的方法体来实现类(或接口)。

public IWebElement FindElement(By by)
{
    throw new NotImplementedException();
}

我的问题是,如果我不想调整这些方法的行为,我该如何实现呢?我只是将它全部留在正文中的那一行,或者我是否必须这样做(如果是这样的话,对于具有返回类型和参数的FindElement方法将如何处理?):

public string CurrentWindowHandle
{
    get
    {
        return _driver.CurrentWindowHandle;
    }
}

public ReadOnlyCollection<string> WindowHandles
{
    get
    {
        return _driver.WindowHandles;
    }
}

public void Close()
{
    _driver.Close();
}

public void Quit()
{
    _driver.Quit();
}

我只是想在IWebDriver接口中添加一个字符串变量来跟踪正在运行的测试。

编辑:我找到了一个替代解决方案来解决我的初始问题(正确记录测试结果),这个解决方案不涉及实现任何新功能,而是将try / catches放在正确的位置。

此问题的解决方案可以在标记的答案以及下面的@AlexanderWinter中显示实现示例,其中包括全局检索数据的方法。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

使用外部方法保存数据,而不是扩展类。您可以使用的是System.Runtime.CompilerServices.ConditionalWeakTable<TKey, TValue>

您可以通过以下方式使用它:

class TestState
{
    public string Name { get; set; }
}

//initialization of some private field
ConditionalWeakTable<IWebDriver, TestState> myTestsByDriver = new ConditionalWeakTable<IWebDriver, TestState>();

...

//usage:
myTestsByDriver.GetOrCreateValue().Name = "My_First_Test";
//etc.

答案 1 :(得分:1)

查看Extension methods以向函数添加功能,而不是在整个类中创建包装器