使用变量作为动态属性名称

时间:2016-12-21 12:00:05

标签: c#

我有这个,工作正常:

private void BindFilter(DropDownList ddl, IEnumerable<dynamic> items)
{
    ddl.Items.Clear();
    foreach (var item in items)
    {
        ddl.Items.Add(item.bodystyle.ToString());
    }
}

我知道bodystyle是项目的属性。

是否可以通过将字符串作为变量传递来执行此操作,如下所示:

private void BindFilter(DropDownList ddl, string field, IEnumerable<dynamic> items)
{
    ddl.Items.Clear();
    foreach (var item in items)
    {
         ddl.Items.Add(item.{field}.ToString());
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用反射来实现这一目标:

private void BindFilter(DropDownList ddl, string field, IEnumerable<dynamic> items)
{
    ddl.Items.Clear();
    foreach (var item in items)
    {
        var propertyInfo = item.GetType().GetProperty(field);
        var value = propertyInfo.GetValue(item, null);
        ddl.Items.Add(value.ToString());
    }
}

答案 1 :(得分:0)

不使用反射:

private void BindFilter(DropDownList ddl, Func<dynamic, string> getStringAction, IEnumerable<dynamic> items)
    {
        ddl.Items.Clear();
        foreach (var item in items)
        {
            ddl.Items.Add(getStringAction(item));
        }
    }

你这样称呼它:

BindFilter(ddl, item => item.Field.ToString(), items);