csvHelper 在映射器中从一个对象转换为另一个对象

csvHelper casting from one object to another in mapper

我正在使用 CsvHelper 并尝试根据某些 属性 的值映射不同的属性。

Map(m => (m.Prop1 == Enum.Setting1 || m.Prop1 == Enum.Setting2)? m.Prop2 : m.Prop3).Name("MyProperty");

这不起作用导致异常:

System.ArgumentException : 不是会员权限 参数名称:表达式

所以我想我会尝试创建一个新的 class,从我的基础对象继承,然后在映射类型中指定它们。

这种新类型在 属性 中乱七八糟地执行此逻辑。

public class NewClassCsv : BaseClass
{
    public string MyProperty
    {
        get { return (this.Prop1 == Enum.Setting1 || this.Prop1 == Enum.Setting2) ? this.Prop2 : this.Prop3; }
    }

我尝试使用这个新的 class 作为我的地图类型,但是进入助手的 WriteRecords 方法的对象是基本类型,这不会进行强制转换来改变它。

所以我尝试对映射进行转换:

Map(x => ((NewClassCsv)x).MyProperty);

这也没有用,没有找到对象上的 属性。

有人遇到过这个问题并知道如何解决吗?

编辑:自定义映射器部分

csvWriter.Configuration.RegisterClassMap<CustomMap>();

public class CustomMap: CsvClassMap<NewClassCsv>
{
    public override void CreateMap()
    {
        Map(m => m.MyProperty).Name("MyProperty");
    }
}

好的,我正在尝试做一些根本不可能的事情。

首先,我无法从基础 class 转换为派生 class - 我早该知道的更好。

一旦我意识到我有几个选择:

  1. 在 foreach 中手动制作 CSV(不喜欢这种方法)
  2. 只需将显示属性添加到现有对象(这看起来很脏而且是错误的)
  3. 使用 AutoMapper 并将其从一种复杂类型转换为我想要的平面结构,然后直接使用那里的属性。

我当然选择了选项 3:

 //mappings for csv download
        Mapper.CreateMap<TeamFeedMessage, MessageCsv>()
              .ForMember(dest => dest.Alias, opt => opt.MapFrom(t => (t.Message.Contributor.Channel == ChannelEnum.GnipTwitter || t.Message.Contributor.Channel == ChannelEnum.Twitter)? t.Message.Contributor.UserName : t.Message.Contributor.Alias))

public sealed class TeamFeedMessageMap : CsvClassMap<MessageCsv>
{
    public TeamFeedMessageMap()
    {
        AutoMap();
    }
}

然后使用它:

 var newCsvData = Mapper.Map<IEnumerable<TeamFeedMessage>, List<MessageCsv>>(reportData) as IEnumerable;

csvWriter.Configuration.RegisterClassMap<TeamFeedMessageMap>();

csvWriter.WriteRecords(newCsvData);