2013-05-02 19 views
3

比方说,我有一个方法,它打印对象的某些属性的名称和值:如何传递属性的列表的方法使用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

回答

5

使用这样的声明:

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

可赎回,如:

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

至于从每个拉姆达获得财产的名字出来,看到Retrieving Property name from lambda expression。请注意,如果属性的值类型为int(在这种情况下,编译器将在成员访问中生成一元表达式Convert),则可能必须比该答案中提供的要深一点。你想要的,为了框住结构)。

+0

然后我如何使用属性选择器获取对象的值? – ozz 2016-10-13 15:04:42

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现在,所以它可能甚至不会编译,而是沿着这些名字,你可以用自动相处完成...

+0

这就是我现在拥有的。请阅读问题的第二部分:-) – M4N 2013-05-02 15:37:25

+0

如果您自己传递属性,尽管...您无法知道您刚从lambda表达式获得的属性,因此您将无法打印它的名称。我假设你想要的东西像''A:3,B:5,名称:你好'' – SimpleVar 2013-05-02 15:38:57

+0

这是正确的:我需要获取属性的名称和值 – M4N 2013-05-02 15:42:15