Получить строковое представление свойства в C # во время выполнения - PullRequest
4 голосов
/ 20 апреля 2010

Я не раз видел этот вопрос несколько раз, но не видел, как делать то, что хотел бы.

Предположим, у меня есть следующий код:

var myNewData = from t in someOtherData
            select new
            { 
                fieldName = t.Whatever,
                fieldName2 = t.SomeOtherWhatever
            };

Если я хочу привязать данные к этому классу, мое определение столбца должно включать жестко закодированные строки, такие как "fieldName" и "fieldName2".

Есть ли способ вызвать отражение или что-то еще, чтобы я мог сделать что-то эквивалентное приведенному ниже коду (я знаю, что приведенный ниже код недействителен, но я ищу правильное решение).

string columnName = GetPropertyName(myNewData[0].fieldName);

Моя цель заключается в том, чтобы в случае изменения имени переменной в анонимном классе возникла ошибка времени компиляции, пока все ссылки не были исправлены, в отличие от текущей привязки данных, которая опирается на строки, которые не проверяются до времени выполнения.

Любая помощь будет оценена.

Ответы [ 2 ]

7 голосов
/ 20 апреля 2010
string columnName = GetPropertyName(() => myNewData[0].fieldName);

// ...

public static string GetPropertyName<T>(Expression<Func<T>> expr)
{
    // error checking etc removed for brevity

    MemberExpression body = (MemberExpression)expr.Body;
    return body.Member.Name;
}
2 голосов
/ 20 апреля 2010

Вы получаете названия вашей собственности, как это:

using System.Reflection;    

var myNewData = from t in someOtherData
        select new
        { 
            fieldName = t.Whatever,
            fieldName2 = t.SomeOtherWhatever
        };


foreach (PropertyInfo pinfo in myNewData.FirstOrDefault()
                               .GetType().GetProperties()) 
{ 
    string name = pinfo.Name; 
}

// or if you need all strings in a list just use:
List<string> propertyNames = myNewData.FirstOrDefault()
             .GetType().GetProperties().Select(x => x.Name).ToList();
...