如何简化此方法的表达式参数?

时间:2013-03-13 12:26:38

标签: c# selenium lambda functional-programming expression

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

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(_ => personToCreate.FirstName);或类似的东西

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

1 个答案:

答案 0 :(得分:3)

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

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);