T Get <T>(string key, T defaultValue) { object value = null; lock (locker) { if (UserDefaults[key] == null) { return(defaultValue); } switch (defaultValue) { case int i: value = (int)(nint)UserDefaults.IntForKey(key); break; case bool b: value = UserDefaults.BoolForKey(key); break; case long l: var savedLong = UserDefaults.StringForKey(key); value = Convert.ToInt64(savedLong, CultureInfo.InvariantCulture); break; case double d: value = UserDefaults.DoubleForKey(key); break; case float f: value = UserDefaults.FloatForKey(key); break; case string s: // the case when the string is not null value = UserDefaults.StringForKey(key); break; default: // the case when the string is null if (typeof(T) == typeof(string)) { value = UserDefaults.StringForKey(key); } break; } } return((T)value); }