Invalid cast from 'System.String' to 'System.TimeSpan'
I currently have a Generic method that reads an Value from the database based on a key and returns a specific type of that value.
public T Get<T>(string key, T defaultValue)
{
var myparms = new List<SqlParameter>
{
new SqlParameter("@KEY", key),
};
const str开发者_运维技巧ing 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));
}
But when I try and return a TimeSpan type I get the following exception. Invalid cast from 'System.String' to 'System.TimeSpan'.
After a bit of googling I found that the most common solution is to use the TimeSpan.Parse
or TimeSpan.TryParse
methods.
I also found TimeSpan Structure.
public struct TimeSpan : IComparable, IComparable,
IEquatable, IFormattable
My question is why, why is TimeSpan not able to do this. Is it because it doesn't have the IConvertible
interface? Any thoughts on this would be much appreciated.
I don't think Convert.ChangeType
is what you really want. Try TypeConverter.ConvertFrom
:
var converter = TypeDescriptor.GetConverter(typeof(T));
return converter.CanConvertFrom(returnedValue) ?
(T)converter.ConvertFrom(returnedValue) :
defaultValue;
There isnt an implicit conversion between String
and TimeSpan
, you need to convert explicitly using Parse
or TryParse
There is no explicit cast/conversion defined between string
and TimeSpan
because most strings are not TimeSpan
s.
If the framework defined such a cast, would you also expect these to exist on DateTime
and all other value types?
精彩评论