1

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

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

这不起作用导致异常:

System.ArgumentException:不是成员访问参数名称:表达式

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

这种新类型在属性中直接执行此逻辑。

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

我尝试使用这个新类作为我的地图类型,但进入助手的 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");
    }
}
4

1 回答 1

2

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

一方面,我不能从基类转换为派生类——我应该知道得更好。

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

  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);
于 2016-01-13T14:06:41.643 回答