2014-11-05 109 views
0

目前,我正在爲MVC編寫自定義控件,從而擴展了HtmlHelper。 我正在與Expression<T>在這裏工作,但我相對較新。這是使用Expression <Func <string,string >>的正確方法嗎?

儘管我的代碼正在工作,但我只想驗證這是否正確。

我正在渲染一個控件,我可以以流暢的方式向渲染的控件添加屬性。 將屬性添加到我的控制的方法是使用下面的代碼:

.Attributes(style => "width: 100%;") 

當我想在我的渲染控制使用多個屬性,這種方法可以多次調用:

.Attributes(style => "width: 100%;") 
.Attributes(id => "renderedControl") 

爲了呈現屬性,我正在查看包含該屬性的表達式。

下面是我用添加屬性的方法簽名:

public IGridConstructor<TModel> Attributes(Expression<Func<string, string>> expression) 

所以,我傳遞一個Expression包含Func<string, string>。 函數的輸入參數是屬性的名稱,而輸出參數是屬於此屬性的值。

這並不意味着extression:

style => "width: 100%;" 

應該呈現一個屬性:style="width: 100%"

現在,我已經實現了用下面的代碼:

private void AddAttribute(Expression<Func<string, string>> expression) 
{ 
    var propertyName = expression.Parameters[0].ToString(); 
    var propertyValue = expression.Compile()(string.Empty); 

    GridAttributes.Add(propertyName, propertyValue); 
} 

這是一個正確的做法呢?我不喜歡這裏的[0]

任何幫助,高度讚賞。

+0

編譯表達式是昂貴的。最好不要經常這樣做。我寧願解釋表達式樹(它將是一個常量)。 – usr 2014-11-05 11:42:10

+0

好的,我不知道。介意給我一個關於如何解釋樹的小樣本? – Complexity 2014-11-05 11:42:48

+3

看起來你對這個有點過度設計,一個簡單的鍵值對發生了什麼問題:'.AddAttribute(「style」,「width:100%」)'或'.Attributes(new {style =「寬度:100%「,id =」something「})'? – 2014-11-05 11:44:57

回答

2

我會使用一個匿名對象,它可以讓你添加多個屬性而不是鏈接你的表達式。

private void AddAttributes(object attributes) 
{ 
    foreach(var property in attributes.GetType().GetProperties()) 
    { 
     GridAttributes.Add(
      property.Name, 
      property.GetValue(attributes)); 
    } 
} 

,並調用它是這樣的:

AddAttributes(new { style = "width: 100%;", id = "renderedControl" }); 
+0

我知道這是一個解決方案,但問題表明我想使用表達式{T}。 – Complexity 2014-11-05 12:58:12

+0

我意識到這一點,但認爲它值得加入這個。就我個人而言,我覺得表達方法(雖然很有趣)對於這個目的有點昂貴和不靈活。 – DavidG 2014-11-05 13:00:16

+0

我明白了,但我只想知道表達式{T}的用法是否正確。 – Complexity 2014-11-05 13:04:32

相關問題