【发布时间】:2013-10-01 20:02:54
【问题描述】:
我正在开发一个 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 的 post 涉及创建类型转换器,但我希望覆盖默认的。
作为参考,这是我的实体提取器实现。
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 并且对于每个公共字段,它通过其键获取字典的项,并尝试将其转换为该字段的基础类型。除了布尔值,它运行良好。
【问题讨论】:
-
您可以使用属性为布尔值注册自定义 TypeConverter,然后使用
TypeDescriptor.GetConverter(info.PropertyType),这将始终返回默认的 TypeConverter。在使用前使用生成的转换器将您的值转换为info.PropertyType。
标签: c# type-conversion