从'System.String'到'System.TimeSpan'的无效转换

时间:2011-08-12 10:53:05

标签: c#

我目前有一个Generic方法,它根据键从数据库中读取一个值,并返回该值的特定类型。

    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类型时,我得到以下异常。 Invalid cast from 'System.String' to 'System.TimeSpan'.

经过一些谷歌搜索后,我发现最常见的解决方案是使用TimeSpan.ParseTimeSpan.TryParse方法。

我还找到了TimeSpan结构。

public struct TimeSpan : IComparable, IComparable, IEquatable, IFormattable

我的问题是为什么,为什么TimeSpan无法做到这一点。是因为它没有IConvertible接口吗?对此的任何想法都将非常感激。

3 个答案:

答案 0 :(得分:27)

我认为Convert.ChangeType不是你真正想要的。试试TypeConverter.ConvertFrom

var converter = TypeDescriptor.GetConverter(typeof(T));
return converter.CanConvertFrom(returnedValue) ? 
    (T)converter.ConvertFrom(returnedValue) :
    defaultValue;

答案 1 :(得分:1)

stringTimeSpan之间没有定义明确的广告/转换,因为大多数字符串都不是TimeSpan

如果框架定义了这样的演员表,您是否还希望这些演员表存在于DateTime和所有其他值类型中?

答案 2 :(得分:1)

StringTimeSpan之间没有隐式转换,您需要使用ParseTryParse明确转换