C# - 使用反射进行动态转换

问题描述 投票:0回答:4

我正在尝试从数据表对象中提取值并动态填充一个对象以进行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);
                 }
c# visual-studio reflection casting
4个回答
7
投票

这是一段代码,我用它来完成您想要做的事情;将类型从数据库中转换出来。 通常您可以使用

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?
(可为空布尔值),因此无法转换它。


1
投票

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

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


0
投票

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

为什么会这样,在没有看到更多代码的情况下我不知道。


0
投票

您可以使用以下代码 -

Convert.ChangeType(< 对象值 >, Nullable.GetUnderlyingType(< PropertyInfo 变量 >.PropertyType) ?? < PropertyInfo 变量 >.PropertyType)

© www.soinside.com 2019 - 2024. All rights reserved.