gpt4 book ai didi

c# - 有什么方法可以测试我的转换以避免使用异常?

转载 作者:太空狗 更新时间:2023-10-29 21:35:55 27 4
gpt4 key购买 nike

我正在使用反射从 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);

逻辑等价,优雅,无异常(exception)!

最佳答案

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

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

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

关于c# - 有什么方法可以测试我的转换以避免使用异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7891016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com