我试图从一个数据表对象中拉值,并动态地填充一个webservice调用对象,我尝试了一些方法,但将它们缩小到这个,它似乎缺少的是反映目标类型的能力,并将对象从数据表转换成一个。
我很挠头!
foreach (PropertyInfo pi in zAccount)
{
object o = row[pi.Name];
if (o.GetType() != typeof(DBNull))
{
pi.SetValue(a, o, null);
}
}
这给了我类型转换错误:
System类型的对象。字符串'不能转换为'System.Nullable '类型' 1[System.Boolean]'.
所以理想情况是这样的:
foreach (PropertyInfo pi in zAccount)
{
object o = typeof(pi.GetType())row[pi.Name];
pi.SetValue(a, o, null);
}
下面是一段代码,我用它来做你想做的事情;从数据库中转换类型。通常你可以使用Convert.ChangeType
,但这对可空类型不起作用,所以这个方法处理这种情况。
/// <summary>
/// This wrapper around Convert.ChangeType was done to handle nullable types.
/// See original authors work here: http://aspalliance.com/852
/// </summary>
/// <param name="value">The value to convert.</param>
/// <param name="conversionType">The type to convert to.</param>
/// <returns></returns>
public static object ChangeType(object value, Type conversionType)
{
if (conversionType == null)
{
throw new ArgumentNullException("conversionType");
}
if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if (value == null)
{
return null;
}
NullableConverter nullableConverter = new NullableConverter(conversionType);
conversionType = nullableConverter.UnderlyingType;
}
return Convert.ChangeType(value, conversionType);
}
你可以这样使用:
foreach (PropertyInfo pi in zAccount)
{
object o = ChangeType(row[pi.Name], pi.GetType());
pi.SetValue(a, o, null);
}
编辑:
实际上,重读你的帖子,你的错误信息
System类型的对象。字符串'不能转换为'System.Nullable '类型' 1[System.Boolean]'.
使它看起来像你从数据库中得到的类型是一个string
,但属性的类型是bool?
(可空布尔),因此它不能转换它。
只是猜测,但它可能是你的o是一个字符串(如"false"),你的属性可能是bool,因此错误
您可以使用Convert.ChangeType。这可能会有帮助
这是因为您的行包含的数据类型与帐户类的属性类型不匹配。
我不知道为什么会这样,除非我看到更多你的代码。