请查看以下代码:
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)为假。
你可以帮我解决一下吗?有什么东西我错过了吗?谢谢
答案 0 :(得分:6)
在.NET中,广义类型转换非常差并且不一致(在我看来)。但是对于Enum / int情况,您可以使用IConvertible接口或Convert关联的实用程序类:
int converted = (int)Convert.ChangeType(MyEnum.MyValue, typeof(int));
或
object converted = Convert.ChangeType(myValue, myExpectedType);
作为网站说明,这里有100%免费的库:CodeFluentRuntimeClient 有一个名为ConvertUtilities
的类,它有一堆ChangeType方法重载(包括一个通用的),非常通用,对于类型转换。
答案 1 :(得分:3)
请注意documentation中的评论:
在此类中实现时,此方法始终返回
false
。它永远不会返回true
。
如果您的衍生产品为TypeConverter
,那么您唯一可以获得不同答案的时间。但重要的是要注意框架中TypeConverter
的许多衍生物(例如BaseNumberConverter
)不会覆盖CanConvertFrom
。