簡體   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