返回基类型(结构)的泛型强制转换方法

本文关键字:泛型 转换方法 基类 类型 结构 返回 | 更新日期: 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向上投射到DateTimeT唯一的祖先 - object - 然后向下投射回T

return (T) (object) ToDouble(obj);
你不需要

指定 where T 子句,除非你真的想限制到某些东西(接口、类、结构等)。在这里你没有,所以只需删除 where 子句