c# - 如何使用 lambda 表达式和匿名类型获取类型的属性名称?

标签 c# linq lambda petapoco

我正在尝试使用表达式树和匿名类型来实现以下目标。

假设我有这个类(class):

class Person
{
   public string FirstName {get;set;}
   public string MiddleName {get;set;}
   public string LastName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

现在我希望能够调用以下内容:

string[] names = Foo<Person>(x=> new { x.LastName, x.DateOfBirth });

我希望名字包含 2 个项目,“LastName”和“DateOfBirth”。

我正在尝试扩展 PetaPoco ,以编译时安全的方式而不是编写字符串 sql,这样我就可以指定要包含在 SQL 中的属性/列列表,而不是选择所有内容。我有一些相当大的实体,在某些情况下,出于性能原因我不想选择所有列。

最佳答案

试试这个尺寸:

public static string[] Foo<T, TResult>(Expression<Func<T, TResult>> func)
{
    return typeof(TResult).GetProperties().Select(pi => pi.Name).ToArray();
}

当您从 lamda 返回匿名类型时,您可以遍历此匿名类型的所有属性并使用属性的推断名称。然而,当使用它时,语法更像是:

Foo((Person x) => new { x.LastName, x.DateOfBirth });

这是因为第二个泛型参数是匿名类型。

关于c# - 如何使用 lambda 表达式和匿名类型获取类型的属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9916269/

相关文章:

c# - 在 Linq to Sql 中返回多列?

c# - 如何在 LINQ 中按列表合并分组

c# - 如果一个字段为空,我如何用 Linq 替换一个值?

python - Pandas 添加列比较结果

c# - 如何在 MVC6 中正确注入(inject) HttpContext

c# - 为什么我的 EF Core DbContext 不受 DI 绑定(bind)?

c# - 使用 string.format() 函数或 LINQ 分隔字符串的最佳方法是什么?

lambda - 搜索不一致行为 java-8 流的示例?

C++11 Lambda 函数隐式转换为 bool 与 std::function

c# - 将 .net 核心与常规 .net 集成