提问者:小点点

csv列变更单


我目前正在使用ServiceStack.text从一个对象列表序列化CSV。 我有一个模型:

public class UploadDocument
{

[DataMember(Name = "Patient")]
public string Patient { get; set; }

[DataMember(Name = "Patient First Name")]
public string PatientFirstName { get; set; }

[DataMember(Name = "Patient Last Name")]
public string PatientLastName { get; set; }

[DataMember(Name = "Email")]
public string Email { get; set; }

}

结果是:

Patient,    Patient First Name, Patient Last Name,  Email
XXX,        YYY,                ZZZZZ,              nwerwer@yahoo.com,    
XXX,        YYY,                ZZZZZ,              nwerwerwe@yahoo.com,    
XXX,        YYY,                ZZZZZ,              nwerwe@yahoo.com,   

但是,对于另一个报告,我需要更改csv的顺序并返回:

Email,               Patient,    Patient First Name, Patient Last Name,  
nwerwer@yahoo.com,   XXX,        YYY,                ZZZZZ,                  
nwerwerwe@yahoo.com, XXX,        YYY,                ZZZZZ,                  
nwerwe@yahoo.com,    XXX,        YYY,                ZZZZZ, 

有没有办法避免创建新模型?


共2个答案

匿名用户

您可以使用order选项。 例:[DataMember(Order=0)]

文档位于以下链接:https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-member-order

匿名用户

在CustomHeaderTests.cs中有一些设置自定义头的示例,您可以在其中重写序列化的CSV头。 注意:这是静态配置,应该在启动时初始化一次,因为在运行时改变是不符合线程安全的。

但是我个人会定义一个带有您想要的头的顺序和数量的单独模型,您不应该认为它是重复代码,您在每个用例中声明性地定义您想要的结构,这比在运行时修改序列化实现更易维护。

要在模型之间进行映射,您可以使用ServiceStack的自动映射工具,例如:

var report2 = report1.ConvertTo<List<Report2Document>>();

另一种避免定义模型的解决方案是将模型转换为对象字典,按照所需顺序将每个字典转换为列表>,并将其序列化。