假设我有一个方法,它打印对象的某些属性的名称和值:
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
?
答案 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,所以它甚至可能无法编译,但沿着这些名称你可以自动完成......