使用反射在运行时转换类型



请看下面的代码:

        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"和Enum对象时,这段代码没有返回true是一个谜。我甚至在即时窗口中尝试了"val1.Equals((int)(val2))",结果为真,但仍然converter1.CanConvertFrom(type2)为假。

你能帮我一下吗?我是不是漏掉了什么?

谢谢

在。net中,广义类型转换非常差,而且不一致(在我看来)。但是对于Enum/int类型,您可以使用IConvertible接口,或者Convert相关的实用程序类:

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

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

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

请注意文档中的注释:

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

唯一一次你会得到一个不同的答案是如果你有TypeConverter的导数。但重要的是要注意,框架中TypeConverter的许多衍生品(例如BaseNumberConverter)不会覆盖CanConvertFrom

相关内容

  • 没有找到相关文章

最新更新