我正在尝试使用表达式树和匿名类型来实现以下目标。
假设我有这个类(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/