【问题标题】:More than one method 'ConvertFromString' on type '' is compatible with the supplied arguments类型 \'\' 上的一种以上方法 \'ConvertFromString\' 与提供的参数兼容
【发布时间】:2022-11-24 01:08:27
【问题描述】:

我的 CsvBool 转换器是

public class CsvBool : BooleanConverter
    {
        public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
        {
            if (value == null)
                return string.Empty;
            
            var boolValue = (bool)value;

            return boolValue ? "YES" : "NO";
        }

        public override string ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
        {
            if (text == null)
                return string.Empty;

            if (text == "YES")
                return "true";
            else
                return "false";   
        }
    }

写入文件时,一切都按预期进行。所有真布尔值都写成 YES

在尝试读取 csv 文件时,出现错误

More than one method 'ConvertFromString' on type 'CsvBool' is compatible with the supplied arguments.

错误是第一个循环中的CsvHelperException类型

我在这里做错了什么?

using (var reader = new StreamReader(filePath))
   using (var csv = new CsvReader(reader, csvConfig))

     csv.Context.TypeConverterCache.RemoveConverter<bool>();
     csv.Context.TypeConverterCache.AddConverter<bool>(new CsvBool());

     csv.Context.RegisterClassMap<CsvProduct>();
     var CsvProducts = csv.GetRecords<Product>();
     foreach (var CsvProduct in CsvProducts)
     {

     }

这是我的映射类

public class CsvProduct : ClassMap<Product>
    {
        public CsvProduct()
        {
            Map(m => m.Active).Name("ActiveColumn").TypeConverter<CsvBool>();
        }
    }

【问题讨论】:

  • public override string ConvertFromString 对于 BooleanConverter 来说似乎很奇怪。它不应该返回Boolean吗?
  • ConvertFromString 应具有 object 的返回类型并返回 bool 值,而不是 string 值。
  • 从 .NET 5 开始,您可以覆盖具有更具体(派生)返回类型的方法,但是 string 在这里是错误的类型(您需要 bool),并且 CsvHelper 中没有任何东西可以利用它在调用它时,所以这样做没有意义。

标签: c# .net csvhelper


【解决方案1】:

您的 ConvertFromString 需要返回 object 而不是 string。由于您将其标记为 return string,它现在既可以看到返回对象的 BooleanConverter 中的原始 ConvertFromString,也可以看到返回字符串的 ConvertFromString

public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
    if (text == null)
        return string.Empty;

    if (text == "YES")
        return true;
    else
        return false;
}

仅供参考,已经有一个 TypeConverterOption 可以满足您的需求。

您可以将其设置在ClassMap

Map(m => m.Active).Name("ActiveColumn").TypeConverterOption.BooleanValues(true,false,"YES").TypeConverterOption.BooleanValues(false,false,"NO");

或在全球范围内通过TypeConverterOptionsCache

csv.Context.TypeConverterOptionsCache.GetOptions<bool>().BooleanTrueValues.Add("YES");
csv.Context.TypeConverterOptionsCache.GetOptions<bool>().BooleanFalseValues.Add("NO");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多