2017-01-03 4 views
1

Я этот код:Получить список имени свойства с лямбда

public string GetPropName<T1, T2>(Expression<Func<T1, T2>> expression) 
    { 
     var member = expression.Body as MemberExpression; 
     if (member != null) return member.Member.Name; 
     throw new ArgumentException(); 
    } 

С его помощью я могу получить имя свойства с Ламбой:

string propName= GetPropName((MyObject o) => o.MyProperty); 
// propName will be "MyProperty" 

Я хочу, чтобы достичь того же но метод должен вернуть список имен свойств. Например:

List<string> PropNames= GetPropName((MyObject o) => o.MyProp, o.MySecondProp, o.EtcProp); 
//PropNames will contains "MyProp", "MySecondProp", "EtcProp" 

Как вы думаете, что это возможно?

Заранее спасибо

Edit:

p.s.w.g ответ хорошо работает!

Я нашел другую альтернативу:

public List<String> GetPropNames<T>(params Expression<Func<T, object>>[] navigationProperties) 
{ 
    var result = new List<String>(); 
    foreach (var navigationProperty in navigationProperties) 
    { 
     var member = navigationProperty.Body as MemberExpression; 
     if (member == null) 
     { 
      throw new ArgumentException(); 
     } 
     result.Add(member.Member.Name); 
    } 
    return result; 
} 

Тогда я могу назвать это таким образом:

List<String> MyProps= GetPropNames<MyObject>(e => e.MyFirstProp, e => e.MySecondProp,e=> MyEtcProp); 

Это тоже работает. Спасибо большое!

+3

Любые причины, по которым вы не хотите использовать 'nameof' вместо этого? Подобная вещь была полезной до «имени», но теперь она не имеет большого значения, ИМО. –

+0

Visual studio 2013. Я не думаю, что смогу использовать его ... :( – Speuline

+1

Хм. Я лично попытаюсь перейти на более новую версию Visual Studio, а не в беспорядок с деревьями выражений ... –

ответ

2

Я согласен с условиями использования comment: nameof является лучшим способом получить произвольные имена свойств. Но если предположить, что это абсолютно не вариант, вот один из способов сделать это с помощью деревьев выражений:

public string[] GetPropNames<T1, T2>(Expression<Func<T1, T2>> expression) 
{ 
    var newExp = expression.Body as NewExpression; 
    if (newExp == null) 
    { 
     throw new ArgumentException(); 
    } 

    var props = new List<string>(newExp.Arguments.Count); 
    foreach (var argExp in newExp.Arguments) 
    { 
     var memberExp = argExp as MemberExpression; 
     if (memberExp == null) 
     { 
      throw new ArgumentException(); 
     } 
     props.Add(memberExp.Member.Name); 
    } 
    return props.ToArray(); 
} 

Использование:

GetPropNames((MyObject o) => new { o.MyProp, o.MySecondProp, o.EtcProp }) 

Это довольно хрупким, но он должен продемонстрировать общий принцип.

+0

Спасибо, много! Я добавил альтернативное решение в Главная страница. Не стесняйтесь рассказывать мне, что вы думаете об этом! – Speuline

+1

@Speuline Ваше решение работает тоже. Я предпочитаю синтаксис только одного выражения с 'new {...}', но это действительно просто вопрос вкуса –

+0

Да, это то, о чем я думал! Спасибо за ваше время! – Speuline