Я реорганизовал общий CSV-конструктор для List, используя лямбда-выражения для доступа к правильным значениям
public static string ToCsv<TModel>(this List<TModel> list, string delimiter, string lineBreak, string valueWrap, params Expression<Func<TModel, object>>[] expressions)
{
var sb = new StringBuilder();
var headers = expressions.Select(m => String.Format("{0}{1}{0}", valueWrap, GetPropertyName(m))).ToArray();
sb.Append(String.Format("{0}{1}", String.Join(delimiter, headers), lineBreak));
foreach (var listItem in list)
{
var values = expressions.Select(m => String.Format("{0}{1}{0}", valueWrap, m.Compile()(listItem))).ToArray();
sb.Append(String.Format("{0}{1}", String.Join(delimiter, values), lineBreak));
}
return sb.ToString();
}
Это работает хорошо, однако, потому что я пытаюсь переместить это в некоторый общий код для нескольких проектов на нескольких серверах для доступа. Я не могу сослаться на System.Web.Mvc
сборку
Есть ли хороший способ получить доступ к атрибуту DisplayName
и, если он не существует, получить доступ к имени переменной?
Моя текущая попытка доступа к ((MemberExpression) expression.Body).Member.Name
, однако она не будет работать, если ей нужно будет преобразовать значение в строку. (т.е. передавая int и неявно преобразуя)
Вторая попытка перебора атрибутов не сработала для внутреннего класса (т. Е. model
=> model.innerClass.property
)