访问非静态类的属性而不将其分配给变量
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 => r.Page)
的重载
我不熟悉这个框架,但是我假设你可以为页面类型写一个扩展方法,叫做 smth,比如RememberTitle
,调用里面的Remember
方法并返回页面。其他方法也一样。
也许这需要一点澄清:这是一个使用页面对象模型的自定义框架。所有方法都返回对象,包括Remember()。 @DavidOganov为我们想要记住的所有事情创建类似RememberTItle的方法的问题是1)页面类中有很多额外的方法2)我想将值记住到超出范围的自定义参数字典中在页面上。 @Stefanos lamda 似乎是要走的路;我正在尝试做类似的事情,但我不确定r
应该是什么
@IoanaNicu 无论是自定义框架还是您编写的都没有关系。我打算做的是有一个这样的方法:public static Page Remember(this Page page, Func<Page, string> getTitle) var title = getProperty(page); // Use the title return page;
我会把这个作为更好的格式和可读性的答案发布
【参考方案1】:
你可以做的是写一个extension method来达到你想要的结果。
假设您提到的 page 是 Page
类型,而您提到的 Title 是 string
类型。那么就可以有如下扩展方法:
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();
【讨论】:
这听起来像是一个很好的解决方案,但我无法让它发挥作用。我添加了有关页面内部的更多详细信息。也许在尝试简化代码时我忽略了一些关键信息。以上是关于访问非静态类的属性而不将其分配给变量的主要内容,如果未能解决你的问题,请参考以下文章