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

时间:2014-04-02 10:44:39

标签: c# generics casting

我想编写一个将值(对象)转换为基本类型(如string,int,double等)的方法。我在一个将DataRows映射到对象上的例程中使用此方法。

我写了这个:

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是一个结构而我无法使用(用于exaple)

return ToDouble(obj) as T;

既不是

return (T) ToDouble(obj);

如果我替换条款

where T : struct

where T : class

然后我无法使用int,bool,double等来调用该方法...因为它们不是类。

我不知道是否有办法实现这一目标;替代方法是直接调用ToBool,ToInt等简单方法,而不是从泛型方法传递,但我更喜欢使用单个强制转换方法。

我能做些什么吗?任何帮助将不胜感激,也是替代品。

提前致谢。

2 个答案:

答案 0 :(得分:2)

这是因为,就编译器所知,TDateTime之间没有可能的转换。

尝试将DateTime向上转发给唯一的祖先DateTimeT有共同点 - object - 然后向下转发回T

return (T) (object) ToDouble(obj);

答案 1 :(得分:0)

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