2013-03-13 61 views
4

有反正我可以改變這個方法不需要對象,但只傳遞一個參數表達式:如何簡化此方法表達式參數?

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,並將該文本作爲字符串的值。

+0

我不這麼認爲,你在這裏需要你的對象 - >「VAR值=(字符串)propertyInfo.GetValue(obj,null);「你想實現的方法只會傳遞字符串到這個方法,所以你會丟失對obj的引用。 – mariozski 2013-03-13 12:35:42

回答

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

似乎工作,很好;-) – mariozski 2013-03-13 12:47:42

+0

謝謝你的工作很好。不要以爲你怎麼能得到類似的東西來獲得價值,但是讓我做一些事情,比如我們必須將DateTime格式化爲shortdatetimestring。如果我通過顯式失敗的FillInTextFor(()=> personToCreate.DateOfBirth.Value.ToShortDateString())。 – GraemeMiller 2013-03-13 12:59:07

+0

您必須調查表達式。 – mathieu 2013-03-13 13:48:14