假设我有以下界面:
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
。
这不太漂亮,但看起来这个
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);
}
}