C# 如何从参数Func获取属性名<;T、 字符串>;[]λ表达式

C# 如何从参数Func获取属性名<;T、 字符串>;[]λ表达式,c#,lambda,C#,Lambda,我有以下类可将数据导出到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; }

我有以下类可将数据导出到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);
    }
}
等等

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

"FirstName", "LastName", <--------Headers
"FirstName1","LastName1", <---------Data row 1
"FirstName2","LastName2",<---------Data row 2
“FirstName”、“LastName”、而不是
Func
,您需要将参数类型更改为
表达式
,指示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);
}
"FirstName", "LastName", <--------Headers
"FirstName1","LastName1", <---------Data row 1
"FirstName2","LastName2",<---------Data row 2
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);
}