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 - 我早该知道的更好。
一旦我意识到我有几个选择:
- 在 foreach 中手动制作 CSV(不喜欢这种方法)
- 只需将显示属性添加到现有对象(这看起来很脏而且是错误的)
- 使用 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);
我正在使用 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 - 我早该知道的更好。
一旦我意识到我有几个选择:
- 在 foreach 中手动制作 CSV(不喜欢这种方法)
- 只需将显示属性添加到现有对象(这看起来很脏而且是错误的)
- 使用 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);