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

标签 c#

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

    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.ParseTimeSpan.TryParse 方法。

我还找到了TimeSpan结构。

public struct TimeSpan : IComparable, IComparable, IEquatable、IFormattable

我的问题是为什么,为什么 TimeSpan 不能做到这一点。是不是因为没有IConvertible接口(interface)?对此有任何想法将不胜感激。

最佳答案

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

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

关于c# - 从 'System.String' 到 'System.TimeSpan' 的转换无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7039072/

相关文章:

c# - 将我的项目中的表单添加到另一个项目

c# - 更好的填充 ListBox DataTemplate 的性能

c# - 如何从 XmlReader 获取范围内的命名空间

c# - 无法删除数据库,因为它当前正在使用中

c# - 您可以为 Controller 启用 [Authorize] 但为单个操作禁用它吗?

c# - 我们什么时候应该捕获 DUMP 文件进行调试

c# - 从浏览器安装后启动 Silverlight Out-of-Browser

c# - 具有 ExpectedException 的 XUnit 和 MSTest 返回不同的结果

c# - VB 中的 Linq.Expression GetValue?

c# - 将 Color32[] 数组快速复制到 byte[] 数组