如何从参数Func< T,string> [] lambda表达式中获取属性名称 [英] How to get the property name from the params Func<T, string>[] lambda expression

查看:93
本文介绍了如何从参数Func< T,string> [] lambda表达式中获取属性名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have the following class to export data to 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)用作列标题:

I the result I want is to use the property name for example FirstName and LastName in this example as column headers:

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

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

Any clue on how to modify the lambda expression to acomplish this?

推荐答案

而不是 Func<> ,您需要将参数类型更改为 Expression< Func<>;> ,指示C#根据所提供的lambda表达式构造一个表达式树.

Instead of a Func<>, you'll need to change your parameter type to Expression<Func<>>, instructing C# to construct an expression tree based on the lambda expression that's provided.

然后,类似的事情应该起作用:

Then, something like this should work:

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);
}

这篇关于如何从参数Func&lt; T,string&gt; [] lambda表达式中获取属性名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆