【发布时间】:2011-06-21 14:33:49
【问题描述】:
我使用 lambda 表达式为 List 重构了一个通用 CSV 构建器以访问正确的值
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)
【问题讨论】:
-
更多信息:在没有解决方案之后,我继续使用
System.Web.Mvc.ExpressionHelper,但是我遇到了另一个问题。如果没有 HtmlHelper 及其 ViewData,它将无法获取属性的 DisplayName Attribute。有什么想法吗?
标签: c# asp.net-mvc linq reflection extension-methods