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;