如何使用lambda表达式将属性列表传递给方法

时间:2013-05-02 15:32:15

标签: c# reflection lambda

假设我有一个方法,它打印对象的某些属性的名称和值:

public void PrintProperties(object o, params string[] propertyNames)
{
    foreach (var propertyName in propertyNames)
    {
        // get the property info,
        // then get the property's value,
        // print property-name and -value
    }
}
// method can be used like this
PrintProperties(user, "FirstName", "LastName", "Email");

现在不必将字符串列表传递给方法,我想更改该方法,以便可以使用lambda表达式指定属性(不确定这是否是正确的术语)。

E.g。我希望能够以某种方式调用我的方法:

PrintProperties(user, u->u.FirstName, u->u.LastName, u->u.Email);

目标是为用户提供intellisense支持方法,以防止输入错误。 (类似于ASP.NET MVC辅助方法,如TextBoxFor(u=>u.Name))。

我如何定义我的方法,然后如何在方法中获取PropertyInfo

2 个答案:

答案 0 :(得分:5)

使用这样的声明:

void PrintProperties<T>(T obj,
                        params Expression<Func<T, object>>[] propertySelectors)
{
   ...
}

可调用:

PrintProperties(user, u => u.FirstName, u => u.LastName, u => u.Email);

至于从每个lambda获取属性名称,请参阅Retrieving Property name from lambda expression。请注意,如果属性类型为int,则可能必须比该答案中提供的内容更深一些(在这种情况下,编译器将生成一元Convert在你想要的成员访问上的表达式,以便对结构进行包装。)

答案 1 :(得分:1)

Reflection允许您访问字段,属性,事件等。

public void PrintProperties(object o, params string[] propertyNames)
{
    foreach (var propertyName in propertyNames)
    {
        // Dont have VS now, but it's something like that
        Console.WriteLine(o.GetType().GetProperty(propertyName).GetValue(o, null));
    }
}

我现在没有VS,所以它甚至可能无法编译,但沿着这些名称你可以自动完成......