c# - 如何使用 lambda 表达式将属性列表传递给方法

标签 c# reflection 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 表达式指定属性(不确定这是不是正确的术语).

例如我希望能够像这样(以某种方式)调用我的方法:

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/

相关文章:

javascript - 在 HTML 元素的文本中搜索

c# - 如何判断用户何时从 Windows 的 Ctrl-Alt-Del 屏幕返回

java - 使用反射访问不可见的类

c# - 反射(reflection):如何在 C# 7.0 中查找和调​​用本地函数?

c# - 控制台或图形游戏设计?

c# - C# : How to remove hover background? 中的自定义按钮

c++ - 在 C++ 中按名称访问结构字段的现代方法

Java:使用 lambda 在流中查找多个最小/最大属性值

c# - x => x + 1和x => x + = 1之间有区别吗?

c# - 使用 Lambda 表达式进行字符串连接