我有两种类型sourceType
,targetType
我需要在 C# 中编写一个方法,该方法检查是否sourceType
可以将 的值分配给targetType
. 该函数的签名是MatchResultTypeAndExpectedType(Type sourceType, Type targetType)
。
继承由IsAssignableFrom覆盖。在可转换类型的情况下,我想使用CanConvertFrom,但是,例如,如果两种类型都是数字的,那么它总是返回false
。我执行的测试:
TypeConverter typeConverter = TypeDescriptor.GetConverter(typeof(Decimal));
Console.WriteLine("Int16 to Decimal - " + typeConverter.CanConvertFrom(typeof(Int16)));
Console.WriteLine("UInt16 to Decimal - " + typeConverter.CanConvertFrom(typeof(UInt16)));
typeConverter = TypeDescriptor.GetConverter(typeof(long));
Console.WriteLine("UInt16 to Int64 - " + typeConverter.CanConvertFrom(typeof(uint)));
typeConverter = TypeDescriptor.GetConverter(typeof(Double));
Console.WriteLine("UInt16 to Double - " + typeConverter.CanConvertFrom(typeof(UInt16)));
typeConverter = TypeDescriptor.GetConverter(typeof(String));
Console.WriteLine("UInt16 to String - " + typeConverter.CanConvertFrom(typeof(UInt16)));
结果是:
Int16 to Decimal - False
UInt16 to Decimal - False
UInt16 to Int64 - False
UInt16 to Double - False
UInt16 to String - False
[编辑]所以我的问题:.NET 中是否有办法检查给定类型的值是否可以在不知道值的情况下分配给另一种类型的变量,例如,隐式转换是否会成功?更具体的实施要求MatchResultTypeAndExpectedType(Type sourceType, Type targetType)
:
- 源和目标类型在编译时是未知的,因为它们的程序集是稍后加载的。
- 不能提供任何值或对象作为输入。
- 在实现中不能创建任何类型的对象,因为系统的其余部分不允许这样做。可以创建值类型的值。
- 只需要检查隐式转换。
是否sourceType
为值类型是已知的。所以方法的签名可以像MatchResultTypeAndExpectedType(Type sourceType, Boolean isSourceValueType, Type targetType)
一种方法是实现隐式数字转换表,但它不会涵盖其他转换或用户定义的转换。