【问题标题】:How can I simplify this methods expression parameters?如何简化此方法的表达式参数?
【发布时间】:2013-03-13 12:26:38
【问题描述】:

无论如何我可以将这个方法更改为不需要对象而只需传递参数表达式:

protected void FillInTextFor<T>(T obj, Expression<Func<T, object>> property)
{
    var memberExpression = (MemberExpression)property.Body;
    var propertyInfo = (PropertyInfo)memberExpression.Member;
    // read value with reflection
    var value = (string)propertyInfo.GetValue(obj, null);
    // use the name and value of the property
    FillInText(propertyInfo.Name, value);
}

    protected void FillInText(String elementId, String text)
    {
        VerifyElementPresent(elementId);
        Driver.FindElement(By.Id(elementId)).Clear();
        Driver.FindElement(By.Id(elementId)).SendKeys(text);
    }

打电话给喜欢
var personToCreate = new PersonBuilder().RandomFirstName().Build(); FillInTextFor(personToCreate, a => a.FirstName);

我只想说FillInTextFor(_ =&gt; personToCreate.FirstName); 或类似的话

我们正在尝试为 Selenium 测试创建辅助方法。我想传递一个对象并选择一个属性,它会自动使用属性的名称作为元素 id,并将文本作为字符串的值。

【问题讨论】:

  • 我不这么认为,因为你在这里需要你的对象 -> "var value = (string)propertyInfo.GetValue(obj, null);"而您想要实现的方法只会将字符串传递给此方法,因此您将缺少对 obj 的引用。

标签: c# selenium lambda functional-programming expression


【解决方案1】:

你可以像这样创建一个重载:

protected void FillInTextFor<T>(Expression<Func<T>> property)
{
    var memberExpression = (MemberExpression)property.Body;
    var propertyInfo = (PropertyInfo)memberExpression.Member;
    var compiled = property.Compile();
    var value = compiled();
    FillInText(propertyInfo.Name, value as string);
}

并使用 :

调用它
var personToCreate = new PersonBuilder().RandomFirstName().Build();
FillInTextFor(() => personToCreate.FirstName);

【讨论】:

  • 谢谢,效果很好。不要以为您知道我如何获得类似的东西来获取价值,但允许我做一些事情,例如我们必须将 DateTime 格式化为 shortdatetimestring。如果我传入 FillInTextFor(() => personToCreate.DateOfBirth.Value.ToShortDateString()) 显然会失败。
  • 你必须调查这个表达式。
猜你喜欢
  • 2022-01-18
  • 2018-10-08
  • 1970-01-01
  • 2022-06-14
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2016-04-25
相关资源
最近更新 更多