这是使用Expression <func <string,string =“”>&gt;?</func <string,>的正确方法

时间:2014-11-05 11:39:13

标签: c# asp.net-mvc html-helper

目前,我正在为MVC编写自定义控件,从而扩展了HtmlHelper。 我在这里与Expression<T>合作,但我相对较新。

尽管我的代码正在运行,但我只想验证这是否正确。

我正在渲染一个控件,我可以流畅地为渲染控件添加属性。 向我的控件添加属性的方法是使用以下代码:

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

当我想在渲染控件上使用多个属性时,可以多次调用此方法:

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

为了呈现属性,我正在查找包含属性的表达式。

以下是我用于添加属性的方法签名:

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

所以,我传递的Expression包含Func<string, string>。 函数的输入参数是属性的名称,而输出参数是属于此属性的值。

这确实意味着限制:

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]不满意。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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" });