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在方法中获取 s ?

4

2 回答 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 中获取属性名称,请参阅Retrieving Property name from lambda expressionint请注意,如果属性是值类型(在这种情况下,编译器将Convert在您想要的成员访问权限上生成一元表达式),您可能需要比该答案中提供的内容更深入一点,以便对结构进行装箱)。

于 2013-05-02T15:35:56.800 回答
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,所以它甚至可能无法编译,但是根据这些名称,您可以与自动完成相处......

于 2013-05-02T15:36:37.730 回答