将外部 classes/variables 与自定义类型转换器一起使用

Using external classes/variables with CustomTypeConverter

我需要根据映射的 class' 参数将 double 字段转换为自定义 string 输出。这最容易用代码显示。

public enum Type {
    Mod,
    NonMod
}

public class Document {
    public double Value { get; set; }
    public Type DocType { get; set; }
}

现在正在尝试转换值字段...
public class DocumentMap : ClassMap<Document>
{
    public DocumentMap
    {
        Map(m => m.Value).Index(0).Name("Value").TypeConverter<CustomDoubleConverter>()
        Map(m => m.Type).Index(1).Name("Type");
    }

    private class CustomDoubleConverter : DefaultTypeConverter
    {
        public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
        {
            return text == "ModVal" ? null : double.Parse(text);
        }
        public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
        {
            return (double)value == 0 /* && Document.Type == Type.Mod*/ ? "ModVal" : value.ToString();
        }
    }
}

我需要 CustomDoubleConverter 中的 Document 类型来为 Mod 类型的文档编写“ModVal” 。唯一的问题是将值 转换为 字符串,因为转换回来意味着它最初已被正确描述。我需要知道每个文档的文档类型,所以我不相信可以将参数传递到 DocumentMap 实例化中,因为它只实例化一次。

我不太确定我理解你的所有逻辑,但我认为 Convert 可以在 ClassMap 中为你工作。

public class DocumentMap : ClassMap<Document>
{
    public DocumentMap()
    {
        Map(m => m.Value).Name("Value")
        .Convert(args =>
        {
            var value = args.Row.GetField<string>(0);
            
            return value == "ModVal" ? 0 : double.Parse(value);

        }).Convert(args =>
        {
            return args.Value.Value == 0 && args.Value.DocType == Type.Mod ? "ModVal" : args.Value.Value.ToString();
        });
        Map(m => m.DocType).Index(1).Name("Type");
    }
}