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

Bra*_*olt 5 c# linq lambda petapoco

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

假设我有这门课:

class Person
{
   public string FirstName {get;set;}
   public string MiddleName {get;set;}
   public string LastName {get;set;}
   public DateTime DateOfBirth {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

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

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

我希望名称包含 2 个项目:“姓氏”和“出生日期”。

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

Bal*_*nyi 2

我很懒,所以这段代码只处理公共属性。但它应该是您入门的良好基础。

public static string[] Foo<T>(Expression<Func<T, object>> func)
{
    var properties = func.Body.Type.GetProperties();

    return typeof(T).GetProperties()
        .Where(p => properties.Any(x => p.Name == x.Name))
        .Select(p =>
        {
            var attr = (ColumnAttribute) p.GetCustomAttributes(typeof(ColumnAttribute), true).FirstOrDefault();
            return (attr != null ? attr.Name : p.Name);
        }).ToArray();
}
Run Code Online (Sandbox Code Playgroud)