【问题标题】:How to get the property name from the params Func<T, string>[] lambda expression如何从参数 Func<T, string>[] lambda 表达式中获取属性名称
【发布时间】:2015-06-23 02:05:17
【问题描述】:

我有以下类可以将数据导出到 CSV:

public class CsvResult<T> : FileResult where T : class
{
    private const string SEPARATOR = ",";

    public IEnumerable<T> Data { get; private set; }
    public Func<T, string>[] Columns { get; private set; }

    public CsvResult(IEnumerable<T> data, params Func<T, string>[] columns)
        : base("text/csv")
    {
        Data = data;
        Columns = columns;
        FileDownloadName = "Export.csv";
    }

    protected override void WriteFile(HttpResponseBase response)
    {
        response.ContentType = "text/csv";
        response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", FileDownloadName));

        WriteColumns(response);
        WriteData(response);
    }

    private void WriteData(HttpResponseBase response)
    {
        foreach (var dataItem in Data)
        {
            foreach (var column in Columns)
                WriteCsvCell(response, column(dataItem));
            response.Write(Environment.NewLine);
        }
    }

    private void WriteColumns(HttpResponseBase response)
    {
        foreach (var column in Columns)
            WriteCsvCell(response, column.ToString());

        response.Write(Environment.NewLine);
    }

    private void WriteCsvCell(HttpResponseBase response, string text)
    {
        // Surround with quotes + escape quotes within the text
        response.Write("\"" + text.Replace("\"", "\"\"") + "\"");
        response.Write(SEPARATOR);
    }
}

我是这样使用的:

        if (format == RenderFormat.Csv)
            return new CsvResult<User>(
                users,
                u => u.FirstName,
                u => u.LastName);

我得到:

"System.Func`2[HDO.Application.Model.Models.User,System.String]","System.Func`2[HDO.Application.Model.Models.User,System.String]",
"FirstName1","LastName1",
"FirstName2","LastName2",

等等。

我想要的结果是在此示例中使用属性名称,例如 FirstName 和 LastName 作为列标题:

"FirstName", "LastName", <--------Headers
"FirstName1","LastName1", <---------Data row 1
"FirstName2","LastName2",<---------Data row 2

关于如何修改 lambda 表达式以完成此操作的任何线索?

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    您需要将参数类型更改为 Expression&lt;Func&lt;&gt;&gt;,而不是 Func&lt;&gt;,指示 C# 根据提供的 lambda 表达式构造表达式树。

    然后,这样的事情应该可以工作:

    private void WriteColumns(HttpResponseBase response)
    {
        var columnNames = columns
            .Select(lambda => {
                var expressionBody = lambda.Body;
                var memberExpression = (MemberExpression)expressionBody;
                var memberName = memberExpression.Member.Name;
                return memberName;
            })
           .ToList();
        foreach (var column in Columns)
            WriteCsvCell(response, column.ToString());
    
        response.Write(Environment.NewLine);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多