有没有办法测试我的转换以避免使用exception?

我正在使用Reflection从DataRows构造任意对象,当橡胶最终遇到道路时,我需要从DataRow获取一个值并将其分配给对象上的属性。

由于DataRows可能包含不支持转换的类型,因此其中许多都会导致必须处理的exception。 例如,DBnulls可能会在DataRow中出现,或者某种数字格式不能很好地转换为另一种,等等。有什么办法可以避免抛出exception吗? (我不会接受巨大的switch语句来检查目标对象属性和源数据中的每种类型组合。)

public void Merge(DataRow data) { PropertyInfo[] props = this.GetType().GetProperties(BindingFlags...); foreach (PropertyInfo pi in props.Where(p => T_IsPrimitive(p.PropertyType))) { object src = null; if( dataAsDataRow.Table.Columns.Contains(pi.Name) ) src = ((DataRow)data)[pi.Name]; if (src != null) { if( src.GetType() != pi.PropertyType ) { try { src = Convert.ChangeType(src, pi.PropertyType); } catch(InvalidCastException e) { try { src = Convert.ChangeType(src.ToString(), pi.PropertyType); } catch { throw e; } } } pi.SetValue(this, src, null); } } } public bool T_IsPrimitive(Type t) { return t.IsPrimitive || t == typeof(Decimal) || t == typeof(String) || t == typeof(DateTime) || t == typeof(TimeSpan) } 

那么在我实现这些ChangeType转换之前有什么方法可以看吗?


感谢Stecya,这就是我想出的:

  if( src.GetType() != pi.PropertyType ) { object converted = null; TypeConverter converter = TypeDescriptor.GetConverter(pi.PropertyType); if( converter != null ) { if( converter.CanConvertFrom(vType) ) converted = converter.ConvertFrom(src); else if( converter.CanConvertFrom(typeof(String)) ) converted = converter.ConvertFrom(src.ToString()); } src = converted; } if( src != null ) pi.SetValue(this, src, null); 

逻辑上等同,优雅,没有例外!

使用TypeConverter检查是否可以在类型之间进行转换

 bool CanConvert(Type from , Type to) { TypeConverter converter = TypeDescriptor.GetConverter(to); return converter != null && converter.CanConvertFrom(from); } 

您也可以使用此TypeConverter实际从一种类型转换为另一种类型

您可以使用访客模式 。 这是一种让函数为您进行类型检查的优雅方式。