【发布时间】:2013-07-14 15:38:02
【问题描述】:
我有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)
一种方法是实现Implicit Numeric Conversions Table,但它不会涵盖其他转换或用户定义的转换。
【问题讨论】:
-
您应该更严格地定义“转换或分配给另一种数字类型”。当然,您可以将 long 转换/分配给 int,但您会丢失数据,因为 int64 比 int32 多 4 个字节。
-
你是否也关心任何可能实现的implicit/explicit user defined conversion operators?
-
涵盖隐式用户定义的转换运算符会很棒。
标签: c# type-conversion