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

6

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

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表达式来指定属性(不确定是否是正确的术语)。

例如,我希望能够以某种方式调用我的方法:

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

目标是给方法的用户提供智能感知支持,以防止打字错误。(类似于ASP.NET MVC助手方法,如TextBoxFor(u=>u.Name))。

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

2个回答

8

使用如下声明:

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

可调用的方式如下:

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

关于从每个lambda中获取属性名称,请参见从lambda表达式中检索属性名称。请注意,如果属性是值类型(例如int),则可能需要比该答案提供的更深入一些(在这种情况下,编译器将生成一个一元Convert表达式,以在访问所需成员时进行结构体装箱)。


我该如何使用属性选择器获取对象的值? - ozz

1

反射允许您访问字段、属性、事件等。

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,所以它可能甚至不能编译,但是通过这些名称,您可以使用自动完成...


这就是我现在拥有的。请阅读问题的第二部分 :-) - M4N
如果你只传递属性本身,你就无法从 lambda 表达式中知道你刚刚获取了哪个属性,因此你将无法打印它的名称。我假设你想要类似于 "A: 3, B: 5, Name: Hi" 的东西。 - SimpleVar
没错:我需要获取属性的名称和值。 - M4N
那就是这样做的方式。为什么没有反射? - SimpleVar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接