当仅选择单个属性或选择多个属性时,此处给出的答案有效。它们都不适合两者。Lukazoid的答案仅适用于多个属性,其余的适用于单个属性,截至撰写我的答案。
下面的代码考虑了这两种情况,也就是说,您可以使用它来选择单个属性和多个属性。请注意,我没有在此处添加任何健全性检查,因此请随意添加您自己的。
string[] Foo<T>(Expression<Func<Person, T>> func)
{
if (func.Body is NewExpression)
{
// expression selects multiple properties,
// OR, single property but as an anonymous object
// extract property names right from the expression itself
return (func.Body as NewExpression).Members.Select(m => m.Name).ToArray();
// Or, simply using reflection, as shown by Lukazoid
// return typeof(T).GetProperties().Select(p => p.Name).ToArray();
}
else
{
// expression selects only a single property of Person,
// and not as an anonymous object.
return new string[] { (func.Body as MemberExpression).Member.Name };
}
}
或者更简洁地说,使用三元运算符,这一切都变成了这样:
string[] Foo<T>(Expression<Func<Person, T>> func)
{
return (func.Body as NewExpression) != null
? typeof(T).GetProperties().Select(p => p.Name).ToArray()
: new string[] { (func.Body as MemberExpression).Member.Name };
}
下载 LinkPad 文件:LinkPad
在线查看:Repl.it
请随时指出我可能遗漏的任何内容。