【问题标题】:Create list of dynamic objects with order and columns from another list使用另一个列表中的顺序和列创建动态对象列表
【发布时间】:2020-04-12 06:41:01
【问题描述】:

我必须实现将一些 TEST 类型的数据导出到 excel 的功能。视图有一个表,其中填充了一些 TEST 类型的数据。为了让它更有趣,用户可以从这个类型 T 中选择要导出的列。

所以我不能为每个案例制作模型(也许我需要在运行时使用反射和创建类?)因为这种类型的 TEST 有大约 50 个属性(列)。

我发现我可以创建具有选定属性(列)的动态对象列表,但我无法想象我该怎么做。

我有一个方法需要提供工作表、完整数据模型 TEST 列表和列名列表(用于 excel 标题):

public static void FillSheetWithData(ExcelWorksheet ws, List<TEST> data, List<string> columns)
{

    for... [creating header]

    //create dynamic object from TEST only with properties from columns parameter
    List<dynamic> mappedData = data.???

    //fill excel with data
    ws.Cells["A2"].LoadFromCollection(mappedData);
}

例如:


Main model => 

public class TEST
{
    public string Name;
    public string Title;
    public string Client;
    public decimal Price;
    public string Address;
    public string Owner;
    public DateTime Date;
    ...
}

List of columns =>

List<string> columns = new List<string>
{
    "Title",
    "Price",
    "Name",
    "Date"
};

Dynamic object should looks like => 

dynamic obj = new {
    Title = "data from main model",
    Price = "data from main model",
    Name = "data from main model",
    Date = "data from main model"
}

如果你有什么想法,我将不胜感激!

【问题讨论】:

  • 你的意思是List&lt;Dictionary&lt;string, object&gt;&gt;?编辑:或者更确切地说List&lt;ExpandoObject&gt; ...与ExpandoObject可以用作dynamicIDictionary&lt;string, object&gt;
  • List&lt;dynamic&gt; data = new List&lt;dynamic&gt;(); var exp = new ExpandoObject(); var expasdict = exp as IDictionary&lt;string, object&gt;; expasdict[Title] = test.Title; data.Add(exp);

标签: c# excel linq dynamic


【解决方案1】:

我假设您正在使用 EPPlus 进行 Excel 操作。
查看他们对LoadFromCollection 方法的文档,有一个重载接受MemberInfo[],它用于仅填充所提供对象的特定属性。这意味着您可以重用具有所有属性的完整对象,并仅提供您需要导出的成员信息。

开始的东西:

var flags = System.Reflection.BindingFlags.Public  
       | System.Reflection.BindingFlags.Instance  
       | System.Reflection.BindingFlags.GetProperty;

var memberInfos = typeof(TEST)
.GetMembers(flags)
.Where(x =>  columns.Contains(x.Name))
.ToArray();

ws.Cells["A2"].LoadFromCollection(data, ..., ..., flags, memberInfos);

如果您想了解更多关于 GetMebersreflection 的一般信息,docs.microsoft

有很好的起始页

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-10-26
    • 2014-03-23
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多