我正在研究一個從csv數據文件創建實體的ETL類型的應用程序。特別是一個字段 - 一個布爾字段 - 由於系統提供了他們自己對bool的解釋,例如true,false,yes,no,1,0甚至-1等,所以很難處理。如何覆蓋NET類型轉換器?
使用default類型轉換器大多數測試失敗:
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併爲每個公共字段它通過其密鑰獲取字典的項目,並嘗試將其轉換成該字段的基礎類型。它除了布爾之外運作良好。
你可以註冊使用屬性的bool自定義類型轉換器,然後用'TypeDescriptor.GetConverter(info.PropertyType)',它總是在默認返回你的類型轉換器。在使用之前,使用生成的轉換器將您的值轉換爲'info.PropertyType'。 –
可能重複[是否可以重寫現有.net類型的類型描述符?](http://stackoverflow.com/questions/4713177/is-it-possible-to-override-the-type-descriptor-現有網絡類型) –