我想编写一个将值(对象)转换为基本类型(如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等简单方法,而不是从泛型方法传递,但我更喜欢使用单个强制转换方法。
我能做些什么吗?任何帮助将不胜感激,也是替代品。
提前致谢。
答案 0 :(得分:2)
这是因为,就编译器所知,T
与DateTime
之间没有可能的转换。
尝试将DateTime
向上转发给唯一的祖先DateTime
和T
有共同点 - object
- 然后向下转发回T
。
return (T) (object) ToDouble(obj);
答案 1 :(得分:0)
除非你真的想要限制某些东西(接口,类,结构等),否则你不需要指定where T子句。你不在这里,所以只需删除where子句