繁体   English   中英

C#创建一个匿名类

[英]C# create a anonymous class

所以我的要求可能很奇怪。

可以说我有一个CheckoutPage类。 我想要一个具有以下内容的“属性” Button

  • 方法Displayed()Click()
  • 具有自定义吸气剂的属性Text
  • 私有常量locator ,它是在上述方法中使用的xpath

应该以以下方式访问它们( checkoutPage是CheckoutPage的实例):

  • checkoutPage.Button.Click()

  • checkoutPage.Button.Displayed()

  • checkoutPage.Button.Text

实现此目的的一种方法是创建一个Button类并具有:

public class Button{
    const string locator = "BUTTON_LOCATOR";
    private SeleniumDriver Driver;

    public Checkout(SeleniumDriver driver){
        this.Driver = driver;
    }

    public string Text{
        get {
            return Driver.FindElement(locator).Text;
        }
    }

    public bool Displayed(){
        return Driver.FindElement(locator).Displayed;
    }

    public void Click(){
        var button = Driver.FindElement(locator);
        new Actions(Driver).Click(button).Perform();
    }
}

public class CheckoutPage{
    private SeleniumDriver Driver;
    public Button Button;

    public CheckoutPage(SeleniumDriver driver){
        this.Driver = driver;
        this.Button = new Button(Driver);
    }
}

但是,此特定的按钮类将仅使用一次,并且我不想在页面上的每个按钮旁都有一个类。 那么还有另一种方法可以保留CheckoutPage.Button.Something接口吗? 也有可能不必实例化此

也许类似于:

public class CheckoutPage{
    private SeleniumDriver Driver;

    public CheckoutPage(SeleniumDriver driver){
        this.Driver = driver;
    }

    public object Button {
        const string locator = "BUTTON_LOCATOR";

        public bool Displayed(){
            return Driver.FindElement(locator).Displayed;
        }

        public void Click(){
            var button = Driver.FindElement(locator);
            new Actions(Driver).Click(button).Perform();
        }

        public string Text{
            get {
                return Driver.FindElement(locator).Text;
            }
        }
    }
}

匿名类型的处理方法是它们始终在本地范围内。 例如,一种方法不能返回匿名类型,除非将其强制转换为命名类型(例如object )。 这不是很有用,因为调用者将无法访问该类型,因此您将不会获得智能感知,早期绑定或类型安全性。

唯一的解决方法是在调用代码中声明类型,并要求被调用的方法将其用作模板。 例如,这将起作用:

public class Page
{
    public T Button<T>(T template) where T : class
    {
        return (T)Activator.CreateInstance
        (
            typeof(T), 
            new object[] 
            { 
                "Button text", 
                new Action(() => Console.WriteLine("This is a click handler")), 
                false 
            } 
        );
    }
}


public class Program
{
    static public void Main()
    {
        var template = new 
        { 
            Text = (string)null, 
            Click = (Action)null, 
            Displayed = false 
        } ;

        var page = new Page();
        var b = page.Button( template );

        Console.WriteLine(b.Text);
        Console.WriteLine(b.Displayed);
        b.Click();
    }
}

输出:

Button text
False
This is a click handler

当然,如果您给它传递了错误的模板,它将被炸掉。

老实说,我怀疑这种方法或这种思路是否会产生更干净或更清晰的解决方案,而不是像您真正应该的那样简单地声明一个具有三个属性的小类并返回它。

我不推荐这种方法,至少您已经描述过了。 页面对象模型应该为消费者提供一个API……一系列可以在页面上完成的动作列表,而不是单个元素(例如按钮)。 LoginPage页面对象应显示Login(string username, string password)方法,而不是usernamepasswordloginButton元素。

如果要使用此Button类(您将其描述为在页面对象内使用的内部类),则更好地适合页面对象模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM