【问题标题】:Convert dynamic list values into list object将动态列表值转换为列表对象
【发布时间】:2016-03-22 02:34:02
【问题描述】:

我正在尝试导入 Excel 文件。这就是我的 Import 方法的样子。我在这里所做的只是将 excel 数据添加到数据表中并将该数据表转换为动态列表并将其返回给控制器方法:

public List<dynamic> ImportFile(Stream stream)
{
    var productList = new List<Products>();
    using (var package = new ExcelPackage(stream))
    {
        var currentSheet = package.Workbook.Worksheets;
        var workSheet = currentSheet.First();

        //Creating a DataTable
        DataTable tbl = new DataTable();
        bool hasHeader = true; // adjust it accordingly( i've mentioned that this is a simple approach)

        //Creating the header
        foreach (var firstRowCell in workSheet.Cells[1, 1, 1, workSheet.Dimension.End.Column])
        {
            tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
        }

        var startRow = hasHeader ? 2 : 1;
        ////Inserting the stream into DataTable
        for (var rowNum = startRow; rowNum <= workSheet.Dimension.End.Row; rowNum++)
        {
            var wsRow = workSheet.Cells[rowNum, 1, rowNum, workSheet.Dimension.End.Column];
            var row = tbl.NewRow();
            foreach (var cell in wsRow)
            {
                row[cell.Start.Column - 1] = cell.Text;
            }
            tbl.Rows.Add(row);
        }
        //Convert datatable into dynamic list
        var dynamicDt = new List<dynamic>();
        foreach (DataRow row in tbl.Rows)
        {
            dynamic dyn = new ExpandoObject();
            dynamicDt.Add(dyn);
            foreach (DataColumn column in tbl.Columns)
            {
                var dic = (IDictionary<string, object>)dyn;
                dic[column.ColumnName] = row[column];
            }
        }
        return dynamicDt;
    }
}

这是我的控制器方法的样子:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase upload)
{
    IExcelImporter reader = new ExcelImporter();
    var res = new List<dynamic>();
    List<Products> send = new List<Products>();
    if (ModelState.IsValid)
    {
        if (upload != null && upload.ContentLength > 0)
        {
            Stream stream = upload.InputStream;

            if (upload.FileName.EndsWith(".xlsx"))
            {
                //getting the dynamic list(returning dynamic list)
                res = reader.ImportFile(stream);

                //need to bind it a model-class(Products)
                send = res.Select(x=> 
                new Products
                {
                    ID = res.GetType().GetProperty("ID").ToString(),
                    Name = res.GetType().GetProperty("Name").ToString(),
                    //res.Select(e=>e.Price).ToString()//res.GetType().GetProperty("Price").GetValue(res, null).ToString()
                }).ToList(); 
            }
        }
    }
    return View("Index", send);
}

问题:我想要的是将动态列表绑定到模型类(产品)。这样我就可以将它返回给视图。 如何将动态列表映射到 List Products?

这就是我的 IExcelImporter 的样子:

public interface IExcelImporter
{
    List<dynamic> ImportFile(Stream stream);
}

这是我的产品模型的样子:

public class Products
{
    public string ID { get; set; }
    public string Name { get; set; }
    public string Price { get; set; }

}

谁能告诉我如何解决这个问题。先感谢您。

【问题讨论】:

  • 你得到的有什么问题?
  • 我无法将动态列表映射到模型类(Products)以返回视图
  • 在我看来,您正在执行一些反射以获取动态属性并将它们投影到您的模型类中。那不工作吗?怎么了?
  • 您为您的产品属性分配了错误的值。您应该使用属性的值,而不是名称。检查这个答案,看看哪些有你可以使用的扩展方法。 stackoverflow.com/a/1954663/1009036
  • #shoe 动态属性没有给我值。值始终为空

标签: c# asp.net-mvc excel


【解决方案1】:

总的来说,我认为没有理由使用dynamic 作为返回类型。您的ImportFile 方法可能返回IEnumerable&lt;Dictionary&lt;string, string&gt;&gt;。另外,为什么是DataTable?我猜您正在使用另一个示例中的大量复制粘贴,该示例使用DataTable 进行数据库使用,最好创建一个附加列表来存储列名并将它们用作字典中的键,这将为您节省很多铸造。除非您展示一个高度简化的示例,否则您的 ImportFile 方法在可读性和性能方面都有很多开销。

但要直接回答您的问题,

在这里,您将获得 PropertyInfo 的不存在属性“ID”的 List&lt;dynamic&gt; - 这不是您想要的。

res.GetType().GetProperty("ID").ToString() 

你应该使用

// Get value of dynamic property "ID" of an item when iterating over of List<dynamic>
x.ID.ToString()

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2020-09-23
    相关资源
    最近更新 更多