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 中的属性/列的列表,而不是选择所有内容。我有一些相当大的实体,在某些情况下,出于性能原因我不想选择所有列。
我很懒,所以这段代码只处理公共属性。但它应该是您入门的良好基础。
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)