我目前正在使用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,
有没有办法避免创建新模型?
您可以使用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>>();
另一种避免定义模型的解决方案是将模型转换为对象字典,按照所需顺序将每个字典转换为列表
,并将其序列化。