Xamarin.Essentials.使用Xamarin.Forms中的泛型类型设置/获取首选项

b4wnujal  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(134)
public class PreferenceManager
{
    private static PreferenceManager _instance = null;
    private static readonly object _lock = new object();

    private PreferenceManager() { }
    public static PreferenceManager Instance
    {
        get
        {
            lock (_lock)
            {
                if (_instance == null)
                    _instance = new PreferenceManager();

                return _instance;
            }
        }
    }

    public void SetPreference<T>(string key, T value)
    {
        Preferences.Set(key, value);
    }
    public T GetPreference<T>(string key)
    {
        object value = Preferences.Get(key, null);
        return (T)Convert.ChangeType(value, typeof(T));
    }
}

我想做一个 Package 类来管理所有关于Xamarin.Essentials.Preferences的进程。
在Essentials类中,有很多不同类型的覆盖用于获取/设置。
所以,我尝试用泛型和set value来改变返回值,因为我认为它看起来更简单。
但是,SetPreference方法中存在错误:无法从"T"转换为"string"。
有没有什么好的方法来制作 Package 类?
我想用一种方法处理这里的所有进程....:-(

50few1ms

50few1ms1#

根据Xamarin Essentials Preferences.shared.cs on GithubPreferences 中的***set***方法不支持泛型类型。因此我们无法直接将其 Package 在泛型setter中。
根据Xamarin.Essentials: Preferences,Xamarin首选项中只支持七种数据类型。我只能为每种数据类型编写如下代码:

public void SetPreference<T>(string key,T value)
{
    if (value is string)
    {
        Preferences.Set(key, Convert.ToString(value));              
    }
    if (value is double)
    {
        Preferences.Set(key, Convert.ToDouble(value));
    }
    ...
}

希望对你有用。

k3fezbri

k3fezbri2#

如果您只想存储类,则可以简单地使用序列化程序:

public class PreferenceManager
    {
        private static readonly Lazy<PreferenceManager> LazyInstance = new Lazy<PreferenceManager>(() => new PreferenceManager());

        private PreferenceManager() { }
        public static PreferenceManager Instance => LazyInstance.Value;

        public void SetPreference<T>(string key, T value) where T : class => Preferences.Set(key, JsonSerializer.Serialize(value));

        public T GetPreference<T>(string key) where T : class => Preferences.Get(key, null) is string value
            ? JsonSerializer.Deserialize<T>(value)
            : default;
    }

如果你想存储非类,那么最简单的方法是将对象 Package 到类中:

public class PreferenceManager
{
    private static readonly Lazy<PreferenceManager> LazyInstance = new(() => new PreferenceManager());

    private PreferenceManager() { }
    public static PreferenceManager Instance => LazyInstance.Value;

    public void SetPreference<T>(string key, T value) => Preferences.Set(key, JsonSerializer.Serialize(new StoredObject<T>(value)));

    public T GetPreference<T>(string key)
    {
        var o = Preferences.Get(key, null) is { } value
            ? JsonSerializer.Deserialize<StoredObject<T>>(value)
            : null;

        return o is not null ? o.Value : default;
    }

    internal class StoredObject<T>
    {
        internal StoredObject(T value)
        {
            Value = value;
        }

        internal T Value { get; }
    }
}

相关问题