C# 从另一个列表中创建具有顺序和列的动态对象列表

C# 从另一个列表中创建具有顺序和列的动态对象列表,c#,excel,linq,dynamic,C#,Excel,Linq,Dynamic,我必须实现将一些类型测试数据导出到excel的功能。该视图有一个表,其中填充了一些类型测试的数据。为了让它更有趣,用户可以选择此类型中不希望导出的列 所以我不能为每种情况创建模型(也许我需要在运行时使用反射并创建类?),因为这个类型测试有大约50个属性(列) 我发现我可以创建一个包含选定属性(列)的动态对象列表,但我无法想象我如何做到这一点 我有一种方法需要提供工作表、完整数据模型测试列表和列名称列表(对于excel标题): publicstaticvoidfillsheetwithdata(E

我必须实现将一些类型测试数据导出到excel的功能。该视图有一个表,其中填充了一些类型测试的数据。为了让它更有趣,用户可以选择此类型中不希望导出的列

所以我不能为每种情况创建模型(也许我需要在运行时使用反射并创建类?),因为这个类型测试有大约50个属性(列)

我发现我可以创建一个包含选定属性(列)的动态对象列表,但我无法想象我如何做到这一点

我有一种方法需要提供工作表、完整数据模型测试列表和列名称列表(对于excel标题):

publicstaticvoidfillsheetwithdata(Excel工作表、列表数据、列表列)
{
用于…[创建标题]
//仅使用“来自列的属性”参数从测试创建动态对象
列表mappedData=数据。???
//用数据填充excel
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"
}

主模型=>
公开课考试
{
公共字符串名称;
公共字符串标题;
公共字符串客户端;
公共十进制价格;
公共字符串地址;
公共字符串所有者;
公共日期时间日期;
...
}
列列表=>
列表列=新列表
{
“头衔”,
“价格”,
“姓名”,
“日期”
};
动态对象应该看起来像=>
动态obj=新{
Title=“来自主模型的数据”,
Price=“来自主模型的数据”,
Name=“来自主模型的数据”,
日期=“来自主模型的数据”
}

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

我假设您正在使用excel进行操作。
查看他们的方法文档,有一个重载,它接受
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的信息,通常在有一个很好的起始页,您的意思是
列表
?编辑:或者更确切地说是
列表
。。。使用
ExpandoObject
可以用作
动态
IDictionary
列表数据=新列表();var exp=new ExpandoObject();var expasdict=exp作为IDictionary;expasdict[Title]=测试标题;添加数据(exp)
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);