访问非静态类的属性而不将其分配给变量

Posted

技术标签:

【中文标题】访问非静态类的属性而不将其分配给变量【英文标题】:Accessing a property of a non-static class without assigning it to a variable 【发布时间】:2021-11-20 12:57:15 【问题描述】:

我正在使用 Selenium、C# 和页面对象模式编写自定义自动化框架。 我试图在不停止语句的情况下从页面中提取一些值。

基本上我想转这个:

    var page = Login()
        .OpenPage();

    page.Remember(page.Title);
    page.MoreActions()
        .MoreNavigation();

进入这个:

    var page = Login()
        .OpenPage()
        .Remember(???.Title)
        .MoreActions()
        .MoreNavigation();

不确定这是否可能以及我当时如何访问该课程。

注意事项:

所有方法都返回页面 有一个基本的 Page 类和很多 PageName : Page<PageName> 类,代表我在测试中使用的实际类 我想在Page 类中实现Remember 方法,以便我可以在任何地方使用它。 类具有我想用来记住值的属性
LoginPage : NavPage<LoginPage>

    public override string Title => "Hardcoded Title";
    public string OtherProperty => pageContent.GetSomeValue();
...

我有一个测试参数字典。我想记住其中一个参数的值。

我无法使用的解决方案:

将类设为静态并使用类名不是一种选择,因为我们的页面结构基于继承和重载方法。 在所有页面上创建 RememberTitle 方法不是一个选项,因为我想将值记住到参数字典中,并且这样的参数不能通过引用传递。

更新: 根据 cmets,我尝试实现 lamda 表达式:

        public static NavPage<T> Remember(this NavPage<T> page, Func<NavPage<T>, string> getTitle)
        
            var title = getTitle(page);                      
            //use Title
            return page;
        
  .Remember(p => p.Title);

新的错误是There is no argument given that corresponds to the required formal parameter getTitle

【问题讨论】:

如果这些方法不返回您所追求的对象,这是不可能的。为了使这成为可能,库和这些方法中的每一个都需要具有某种流畅的 API 支持,例如。通过返回具有您尝试链接的下一个方法的对象类型。检查.Remember()方法是否有允许你传入一个lamda如.Remember(r =&gt; r.Page)的重载 我不熟悉这个框架,但是我假设你可以为页面类型写一个扩展方法,叫做 smth,比如RememberTitle,调用里面的Remember 方法并返回页面。其他方法也一样。 也许这需要一点澄清:这是一个使用页面对象模型的自定义框架。所有方法都返回对象,包括Remember()。 @DavidOganov为我们想要记住的所有事情创建类似RememberTItle的方法的问题是1)页面类中有很多额外的方法2)我想将值记住到超出范围的自定义参数字典中在页面上。 @Stefanos lamda 似乎是要走的路;我正在尝试做类似的事情,但我不确定r 应该是什么 @IoanaNicu 无论是自定义框架还是您编写的都没有关系。我打算做的是有一个这样的方法:public static Page Remember(this Page page, Func&lt;Page, string&gt; getTitle) var title = getProperty(page); // Use the title return page; 我会把这个作为更好的格式和可读性的答案发布 【参考方案1】:

你可以做的是写一个extension method来达到你想要的结果。 假设您提到的 pagePage 类型,而您提到的 Titlestring 类型。那么就可以有如下扩展方法:

public static Page Remember(this Page page, Func<Page, string> getTitle)         
             
    var title = getTitle(page);             
    // Use the title
    page.Remember(page.title);

    // Return page object for further chaining
    return page;         

那么你可以通过以下方式使用这个扩展方法:

 var page = Login()
    .OpenPage()
    .Remember(p => p.Title)
    .MoreActions()
    .MoreNavigation();

【讨论】:

这听起来像是一个很好的解决方案,但我无法让它发挥作用。我添加了有关页面内部的更多详细信息。也许在尝试简化代码时我忽略了一些关键信息。

以上是关于访问非静态类的属性而不将其分配给变量的主要内容,如果未能解决你的问题,请参考以下文章

静态成员和非静态成员的区别?

JAVA 中外部类可以访问非静态内部类的私有属性???

在静态方法中new 一个内部类对象和new 一个外部类对象的区别

关于C++静态成员函数访问非静态成员变量的问题

静态函数Static

java中静态方法和实例方法的区别