visual studio - c# -使用反射的动态铸造



我试图从一个数据表对象中拉值,并动态地填充一个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。这可能会有帮助

这是因为您的行包含的数据类型与帐户类的属性类型不匹配。

我不知道为什么会这样,除非我看到更多你的代码。

相关内容

  • 没有找到相关文章

最新更新