我目前有一个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.Parse
或TimeSpan.TryParse
方法。
我还找到了TimeSpan结构。
public struct TimeSpan : IComparable, IComparable,
IEquatable, IFormattable
我的问题是为什么,为什么TimeSpan无法做到这一点。是因为它没有IConvertible
接口吗?对此的任何想法都将非常感激。
答案 0 :(得分:27)
我认为Convert.ChangeType
不是你真正想要的。试试TypeConverter.ConvertFrom
:
var converter = TypeDescriptor.GetConverter(typeof(T));
return converter.CanConvertFrom(returnedValue) ?
(T)converter.ConvertFrom(returnedValue) :
defaultValue;
答案 1 :(得分:1)
string
和TimeSpan
之间没有定义明确的广告/转换,因为大多数字符串都不是TimeSpan
。
如果框架定义了这样的演员表,您是否还希望这些演员表存在于DateTime
和所有其他值类型中?
答案 2 :(得分:1)
String
和TimeSpan
之间没有隐式转换,您需要使用Parse
或TryParse
明确转换