我是一个有用的助手,可以进行文本翻译。
我正在开发一种ETL类型的应用程序,该应用程序从csv数据文件中创建实体。其中一个字段 - 布尔字段 - 特别难以处理,因为系统提供了自己的布尔解释,例如true、false、yes、no、1、0甚至-1等。
使用默认类型转换器,大多数测试都失败了:
我想要做的是覆盖默认的System.ComponentModel.BooleanConverter,以便我可以提供自己的解析器来正确处理上述内容。有什么想法吗?
Scott Hanselman的文章涉及创建类型转换器,但我希望覆盖默认的转换器。
供参考,这是我的实体提取器实现。
我正在开发一种ETL类型的应用程序,该应用程序从csv数据文件中创建实体。其中一个字段 - 布尔字段 - 特别难以处理,因为系统提供了自己的布尔解释,例如true、false、yes、no、1、0甚至-1等。
使用默认类型转换器,大多数测试都失败了:
var b1 = Convert.ChangeType("true", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b2 = Convert.ChangeType("false", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b3 = Convert.ChangeType("True", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b4 = Convert.ChangeType("False", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b5 = Convert.ChangeType("TRUE", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b6 = Convert.ChangeType("FALSE", TypeCode.Boolean, CultureInfo.InvariantCulture);
// All below fail
var b7 = Convert.ChangeType("yes", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b8 = Convert.ChangeType("no", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b9 = Convert.ChangeType("Yes", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b10 = Convert.ChangeType("No", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b11 = Convert.ChangeType("YES", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b12 = Convert.ChangeType("NO", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b13 = Convert.ChangeType("1", TypeCode.Boolean, CultureInfo.InvariantCulture);
var b14 = Convert.ChangeType("0", TypeCode.Boolean, CultureInfo.InvariantCulture);
我想要做的是覆盖默认的System.ComponentModel.BooleanConverter,以便我可以提供自己的解析器来正确处理上述内容。有什么想法吗?
Scott Hanselman的文章涉及创建类型转换器,但我希望覆盖默认的转换器。
供参考,这是我的实体提取器实现。
public static TEntity ExtractEntity<TEntity>(Dictionary<string, string> row) where TEntity : class
{
var entity = Activator.CreateInstance<TEntity>();
var entityType = typeof(TEntity);
foreach (var info in entityType.GetProperties())
{
try
{
info.SetValue(
entity,
Convert.ChangeType(row[info.Name], info.PropertyType, CultureInfo.InvariantCulture),
null);
}
catch {}
}
return entity;
}
基本上,它枚举给定的TEntity,并针对每个公共字段,通过其键获取字典项,并尝试将其转换为字段的底层类型。除了布尔值之外,它运行良好。
TypeDescriptor.GetConverter(info.PropertyType)
,它将始终返回你的TypeConverter而不是默认值。使用生成的转换器在使用之前将你的值转换为info.PropertyType
。 - Asad Saeeduddin