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

时间:2011-10-25 14:40:05

标签: c# .net-4.0 exception-handling

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

由于DataRows可能包含不支持转换的类型,因此其中许多都会导致必须处理的异常。例如,DBnulls可能会在DataRow中出现,或者某种数字格式不能很好地转换为另一种,等等。有什么办法可以避免抛出异常吗? (我不会接受巨大的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);

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

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