【问题标题】:C# - Dynamic casting using reflectionC# - 使用反射的动态转换
【发布时间】:2011-07-18 17:17:08
【问题描述】:

我正在尝试从数据表对象中提取值并动态填充对象以进行 Web 服务调用,我尝试了一些方法,但将它们缩小到这个范围,它似乎缺少反映目标类型的能力并将数据表中的对象合二为一。

我在这里经常摸不着头脑!

foreach (PropertyInfo pi in zAccount)
                {
                    object o = row[pi.Name];
                    if (o.GetType() != typeof(DBNull))
                    {
                        pi.SetValue(a, o, null);
                    }
                 }

这给了我类型转换错误:

“System.String”类型的对象无法转换为“System.Nullable`1[System.Boolean]”类型。

所以理想应该是这样的:

foreach (PropertyInfo pi in zAccount)
                {
                    object o = typeof(pi.GetType())row[pi.Name];
                    pi.SetValue(a, o, null);
                 }

【问题讨论】:

  • row 的确切类型是什么?
  • DataRow 我正在遍历一个 DataTable 对象
  • 不能将字符串转换为 Nullable 所以这与动态转换无关。

标签: c# visual-studio reflection casting


【解决方案1】:

这是一段代码,我用它来完成您正在尝试做的事情;将类型转换出数据库。通常你可以使用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.String”类型的对象无法转换为“System.Nullable`1[System.Boolean]”类型。

使它看起来像您从数据库返回的类型是 string,但该属性的类型是 bool?(可为空的布尔值),因此它无法转换它。

【讨论】:

  • 也许吧。我想这取决于row[pi.Name] 的实际值是多少。如果它是字符串“true”或“false”,那么我认为Convert.ChangeType 可能能够将其设为布尔值。如果是字符串 "foo" 那么它仍然会抛出一些异常。
  • 看起来工作正常。并且抛出像“foo”这样的值会很好(并且预期为布尔值)。同样,尝试将“foo”分配给int 时也会出现异常。为我 +1。
  • 对我的代码进行了一些小的修改,就像一个魅力,感谢您的时间! +1
【解决方案2】:

只是猜测,但可能是您的 o 是一个字符串(如“false”)并且您的属性可能是 bool,因此会出现错误。

您可以使用 Convert.ChangeType。这可能会有所帮助

【讨论】:

  • 这可能是正确的答案,但你应该提供一个例子。
【解决方案3】:

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

为什么会这样,如果没有看到更多代码,我不知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多