C# 从“System.String”到“System.TimeSpan”的强制转换无效
我目前有一个通用方法,它基于一个键从数据库中读取一个值,并返回该值的特定类型C# 从“System.String”到“System.TimeSpan”的强制转换无效,c#,C#,我目前有一个通用方法,它基于一个键从数据库中读取一个值,并返回该值的特定类型 public T Get<T>(string key, T defaultValue) { var myparms = new List<SqlParameter> { new SqlParameter("@KEY", key),
public T Get<T>(string key, T defaultValue)
{
var myparms = new List<SqlParameter>
{
new SqlParameter("@KEY", key),
};
const string getPropertyQuery = "SELECT SPARM_VALUE FROM SYSPARAMS WHERE SPARM_KEY = @KEY;";
var returnedValue = //Get value from Database
if (returnedValue == null)
{
return defaultValue; //Value does not exists so return default.
}
return (T)Convert.ChangeType(returnedValue, typeof(T));
}
但是当我尝试返回TimeSpan类型时,我得到了以下异常。从“System.String”到“System.TimeSpan”的强制转换无效
通过谷歌搜索,我发现最常见的解决方案是使用TimeSpan.Parse或TimeSpan.TryParse方法
我还发现了结构
公共结构TimeSpan:IComparable,IComparable,
可以,可以
我的问题是为什么,为什么TimeSpan不能做到这一点。是因为它没有IConvertible接口吗?如果您对此有任何想法,我们将不胜感激。字符串和时间跨度之间没有明确的强制转换/转换定义,因为大多数字符串不是时间跨度 如果框架定义了这样一个强制转换,您是否也希望DateTime和所有其他值类型上存在这些转换?我认为Convert.ChangeType不是您真正想要的。请尝试TypeConverter.ConvertFrom:
字符串和时间跨度之间没有隐式转换,您需要使用Parse或TryParse显式转换没有convert.ToTimeSpan方法的具体原因是什么?我知道并不是所有的值类型都有强制转换,但我只是觉得Convert类不包含TimeSpan很奇怪。@Jethro-可能是因为它没有其他类型使用得多。Convert类已经有很多重载了——添加更多的重载只会增加大量的方法。这是有意义的。谢谢你的输入。嗯,我认为Convert.ChangeType实际上使用了类型转换器。啊,我看到它只使用了IConvertable。太好了,这正是我要找的。谢谢
var converter = TypeDescriptor.GetConverter(typeof(T));
return converter.CanConvertFrom(returnedValue) ?
(T)converter.ConvertFrom(returnedValue) :
defaultValue;