在通用的情况下,类型必须是可转换的

时间:2017-11-20 22:18:03

标签: c# generics bdd specflow

我的测试项目基于BDD方法。 我试图通过静态变量调用方法。但是我的行为中的某些内容是错误的。

我的代码:

public class BasePage
{
    public T As<T>() where T : BasePage
    {
        return (T)this;
    }
}

public class PropertiesCollection
{
    private static BasePage _currentPage;

    public static BasePage currentPage
    {
        get { return _currentPage; }
        set
        {
            ScenarioContext.Current["class"] = value;
            _currentPage = ScenarioContext.Current.Get<BasePage>("class");
        }
    }
}
public sealed class LoginSteps
    {       
        [Given(@"I have navigated to my app")]
        public void GivenIHaveNavigatedToMyApp()
        {            Browser.Current.Navigate().GoToUrl(ConfigurationManager.AppSettings["seleniumBaseUrl"]);
            PropertiesCollection.currentPage = new LoginPage();

        }
        [Given(@"I typed the (.*) and (.*)")]
        public void GivenITypedTheAnd(string username, string password)
        {
            var m = PropertiesCollection.currentPage.As<LoginPage>().Login(username, password);
        }

所以在最后一个代码行中我有消息错误,如&#34;该类型必须可以转换为&#34; .Pages.BasePage&#34;为了在通用方法中使用它作为参数&#34; .Pages.BasePage.As()&#34; 我应该修改什么来修复它?

1 个答案:

答案 0 :(得分:0)

如果没有完整的代码,您无法理解您的问题,但让我向您展示如何实施该问题。

public class Core
{
    protected CorePage CurrentPage
    {
        get
        {
            return ScenarioContext.Current.Get<CorePage>("CurrentPage";
        }
        set
        {
            ScenarioContext.Current["CurrentPage"] = value;
        }
    }

    public TPage InstanceOf<TPage>() where TPage : CorePage, new()
    {
        return new TPage();
    }

    public TPage As<TPage>() where TPage : CorePage
    {
        return (TPage) this;
    }
}

public class CorePage : Core
{
    //Base page class
}

public class HomePage : CorePage
{
    public void OpenLogin()
    {
        //Code 
        CurrentPage = new LoginPage();
    }
}

public class LoginPage : CorePage
{
    public void Something()
    {
        //Code
    }
}

[Binding]
public class Step : Core
{
    [Given(@"1st step")]
    public void BlaBlaBla1()
    {            
        CurrentPage.InstanceOf<HomePage>().OpenLogin();
    }

    [Then(@"2nd step")]
    public void BlaBlaBla2()
    {
        CurrentPage.As<LoginPage>().Something();
    }
}