假设我有一个方法,它打印一个对象的某些属性的名称和值:
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
?
最佳答案
使用这样的声明:
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
expression over the member-access that you want, order to box the struct).
关于c# - 如何使用 lambda 表达式将属性列表传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342019/