Ответы, данные здесь, работают, когда выбрано только одно свойство, ИЛИ, если выбрано несколько свойств.Ни один из них не работает для обоих. ответ от 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
Пожалуйста, не стесняйтесь указывать на все, чтоВозможно, я пропустил.