CSVHelper:动态写入CSV

问题描述 投票:0回答:1

假设我有以下界面:

public interface IStateInformation
{
    public int TaskId { get; set; }
    public string Name { get; set; }
}

以及实现此接口的以下类:

public class ExternalStateInformation : IStateInformation
{
    public int TaskId { get; set; }
    public string Name { get; set; }
    public string External { get; set; }
}

现在我想将以下类写入 CSV:

public class SwitchingData
{
    public string DateTime { get; set; }
    public int EpisodeId { get; set; }
    public IStateInformation SourceState { get; set; }
    public IStateInformation TargetState { get; set; }
}

如您所见,此类包含

IStateInformation
对象。当我尝试将记录写入 CSV 文件时,仅考虑
IStateInformation
的属性(
TaskId
Name
),即使例如
SourceState
属于
ExternalStateInformation
类型(因此缺少
External
)。我的问题是,如何编写动态类型的属性而不是静态类型的属性? 我尝试使用
ClassMap
但没有成功。

详情

编写脚本如下所示:

...         
using (var stream = File.Open(path, FileMode.Append))
using (var writer = new StreamWriter(stream))
using (var csv = new CsvWriter(writer, config))
{
     if(type != null)
     {
         csv.Context.RegisterClassMap(type);
     }
                
     csv.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
     csv.Context.TypeConverterOptionsCache.AddOptions<DateTime?>(options);
     csv.WriteRecords(data);
}
...

其中

type
是我一起玩的
ClassMap

c# csv unity-game-engine csvhelper
1个回答
0
投票

这不太漂亮,但看起来这个

ClassMap
可以用。

public sealed class SwitchingDataClassMap : ClassMap<SwitchingData>
{
    public SwitchingDataClassMap() 
    {
        Map(m => m.DateTime).Index(0);
        Map(m => m.EpisodeId).Index(1);
        Map(m => m.SourceState.TaskId).Name("SourceStateTaskId").Index(2);
        Map(m => m.SourceState.Name).Name("SourceStateName").Index(3);
        Map(m => ((ExternalStateInformation)m.SourceState).External)
            .Convert(args => args.Value.SourceState is ExternalStateInformation ?
                    ((ExternalStateInformation)args.Value.SourceState).External :
                    null)
            .Name("SourceStateExternal").Index(4);
        Map(m => m.TargetState.TaskId).Name("TargetStateTaskId").Index(5);
        Map(m => m.TargetState.Name).Name("TargetStateName").Index(6);
        Map(m => ((ExternalStateInformation)m.TargetState).External)
            .Convert(args => args.Value.TargetState is ExternalStateInformation ?
                    ((ExternalStateInformation)args.Value.TargetState).External :
                    null)
            .Name("TargetStateExternal").Index(7);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.