【问题标题】:Converting Types in runtime using reflection?使用反射在运行时转换类型?
【发布时间】:2012-01-13 14:47:15
【问题描述】:

请看下面的代码:

        var val1 = ExtractValue(firstParam);
        var val2 = ExtractValue(secondParam);

        var type1 = val1.GetType();
        var type2 = val2.GetType();

        TypeConverter converter1 = TypeDescriptor.GetConverter(type1);
        TypeConverter converter2 = TypeDescriptor.GetConverter(type2);

        if (converter1 != null && converter1.CanConvertFrom(type2))
        {
            var temp = converter1.ConvertFrom(val2);
            return val1.Equals(temp);
        }
        return false;

当我尝试使用“int”和枚举对象时,这段代码没有返回 true,这对我来说是个谜。我什至在即时窗口中尝试了“val1.Equals((int)(val2))”,结果为真,但converter1.CanConvertFrom(type2) 仍然为假。

你能帮我解决一下吗?有什么我想念的吗?

谢谢

【问题讨论】:

  • 枚举是 int 类型,它们是可相互转换的。
  • 您假设每种类型都有一个 [TypeConverter]。事实并非如此,只有少数人这样做。
  • @affan,Enum 的默认支持类型是 'int',但不是必须的;例如,它也可能是 long,在这种情况下,它可能会在分配给 int 时溢出。

标签: c# reflection casting runtime


【解决方案1】:

.NET 中的通用类型转换非常糟糕且不一致(在我看来)。但是对于 Enum / int 情况,您可以使用IConvertible 接口,或Convert 关联的实用程序类:

int converted = (int)Convert.ChangeType(MyEnum.MyValue, typeof(int));

object converted = Convert.ChangeType(myValue, myExpectedType);

作为一个站点说明,这个 100% 免费的库在这里:CodeFluentRuntimeClient 有一个名为 ConvertUtilities 的类,它有一堆 ChangeType 方法重载(包括一个泛型),它们非常通用且对类型转换很有用。

【讨论】:

    【解决方案2】:

    注意documentation中的备注:

    在这个类中实现,这个方法总是返回false。它永远不会返回true

    只有当你有TypeConverter 的导数时,你才会得到不同的答案。但重要的是要注意框架中TypeConverter 的许多派生词(比如BaseNumberConverter 不会覆盖CanConvertFrom

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-28
      • 2022-11-29
      • 2019-12-03
      • 2018-01-30
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多