返回基类型(结构)的泛型强制转换方法
本文关键字:泛型 转换方法 基类 类型 结构 返回 | 更新日期: 2023-09-27 17:56:13
我想编写一个将值(对象)转换为基本类型(如字符串,整数,双精度等)的方法。我在对象上映射数据行的例程中使用此方法。
我写了这个:
public static T CastObjectToBasicType<T>(DataRow row, string column)
where T : struct
{
object cellValue = row[column];
if (typeof(T) == typeof(string))
return ToString(cellValue);
if (typeof(T) == typeof(int) || typeof(T) == typeof(int?))
return ToInt(cellValue);
if (typeof(T) == typeof(bool) || typeof(T) == typeof(bool?))
return ToBool(cellValue);
if (typeof(T) == typeof(double) || typeof(T) == typeof(double?))
return ToDouble(cellValue);
if (typeof(T) == typeof(decimal) || typeof(T) == typeof(decimal?))
return ToDecimal(cellValue);
if (typeof(T) == typeof(DateTime) || typeof(T) == typeof(DateTime?))
return ToDateTime(cellValue) ;
throw new ArgumentException("T not supported");
}
其中像ToString,ToBool,ToDouble等方法都是将输入转换为desidered类型的简单方法。
上面的代码无法编译;问题是我无法将结果转换为类型 T,因为 T 是一个结构体,我不能使用(用于示例)
return ToDouble(obj) as T;
也不
return (T) ToDouble(obj);
如果我替换子句
where T : struct
跟
where T : class
那么我就不能使用 int、bool、double 等来调用该方法作为 T,因为它们不是类。
我不知道是否有办法做到这一点;另一种方法是直接调用简单的方法,如ToBool,ToInt等......而不从泛型方法传递,但我更喜欢使用单个强制转换方法。
我能做些什么吗?任何帮助将不胜感激,还有替代方案。
提前谢谢。
这是因为,据编译器所知,T
和例如DateTime
之间没有可能的转换。
尝试将DateTime
向上投射到DateTime
和T
唯一的祖先 - object
- 然后向下投射回T
。
return (T) (object) ToDouble(obj);
你不需要
指定 where T 子句,除非你真的想限制到某些东西(接口、类、结构等)。在这里你没有,所以只需删除 where 子句