Update in 2022:
public static T GetFieldValue<T>(IDictionary<string, object> dict, string fieldName, T defaultValue = default)
{
if (dict.TryGetValue(fieldName, out var value))
return GetValueOrDefault(value, defaultValue);
return defaultValue;
}
public static T ConvertValueOrDefault<T>(object value, T def = default)
{
if (value == null) return def;
if (value is T t) return t;
if (typeof(T) == typeof(string)) {
return (T)(object)$"{value}";
}
var basicType = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
try {
return (T)Convert.ChangeType(value, basicType);
} catch { } // ignore value conversion error
return def;
}When dealing with unknown values, e.g. user input or dynamic.
I wrote a small function:
public static T TryCast(T def, params object[] list)
{
foreach (object obj in list)
{
if (obj == null)
continue;
//if (typeof(T) == typeof(string))
//{
// if (String.IsNullOrWhiteSpace(obj.ToString()))
// {
// continue;
// }
//}
if (obj is T)
return (T)obj;
// for converting long to int etc.
try
{
return (T)Convert.ChangeType(obj, typeof(T));
}
catch (Exception)
{
//Ignore
}
}
return def;
}
The ‘skip empty strings’ is commented and may be used to fullfill your needs.
Usage example:
if (TryCast(false, table.Row["Enabled"])) {
}
A variation of this function, used to get the correct type from a key of the Session object:
public static T SessionGet(string key, T def)
{
if (HttpContext.Current != null && HttpContext.Current.Session != null)
{
object obj = HttpContext.Current.Session[key];
if (obj == null)
{
return def;
}
if (obj is T)
{
return (T)obj;
}
}
return def;
}
10800cookie-checkC# TryCast function