Contents

PlayPrefs封装

Contents
using System;
using System.Collections;
using System.Reflection;
using UnityEngine;

public class PlayerPrefsDataMgr
{
    private static PlayerPrefsDataMgr _instance = new PlayerPrefsDataMgr();
    public static PlayerPrefsDataMgr Instance
    {
        get
        {
            return _instance;
        }
        private set
        {
        }
    }

    private PlayerPrefsDataMgr()
    {

    }

    /// <summary>
    /// 保存数据
    /// </summary>
    /// <param name="obj">要保存的对象</param>
    /// <param name="key">唯一值</param>
    public void SaveData(object obj, string key)
    {
        Type type = obj.GetType();
        FieldInfo[] fields = type.GetFields();
        string keyName;
        for (int i = 0; i < fields.Length; i++)
        {
            keyName = key + "_" + type.Name + "_" + fields[i].FieldType.Name + "_" + fields[i].Name;
            SaveValue(keyName, fields[i].GetValue(obj));
        }
        PlayerPrefs.Save();
    }

    /// <summary>
    /// 获得数据
    /// </summary>
    /// <param name="type">传入对象类型</param>
    /// <param name="key">唯一值Type</param>
    /// <returns></returns>
    public object GetData(Type type, string key)
    {
        object obj = Activator.CreateInstance(type);
        FieldInfo[] fildinfo = type.GetFields();
        string keyName;
        foreach (var info in fildinfo)
        {
            keyName = key + "_" + type.Name + "_" + info.FieldType.Name + "_" + info.Name;
            Debug.Log(keyName);
            info.SetValue(obj, GetValue(info.FieldType, keyName));
        }
        return obj;
    }

    /// <summary>
    /// 把数据存入PlayerPrefs
    /// </summary>
    /// <param name="keyName"></param>
    /// <param name="value"></param>
    private void SaveValue(string keyName, object value)
    {
        Type type = value.GetType();
        if (type == typeof(string)) PlayerPrefs.SetString(keyName, value.ToString());
        else if (type == typeof(int)) PlayerPrefs.SetInt(keyName, (int)value);
        else if (type == typeof(float)) PlayerPrefs.SetFloat(keyName, (float)value);
        else if (type == typeof(bool)) PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0);
        else if (typeof(IList).IsAssignableFrom(type))
        {
            IList list = value as IList;
            PlayerPrefs.SetInt(keyName, list.Count);
            for (int i = 0; i < list.Count; i++)
            {
                SaveValue(keyName + "_" + i, list[i]);
            }
        }
        else if (typeof(IDictionary).IsAssignableFrom(type))
        {
            IDictionary dict = value as IDictionary;
            PlayerPrefs.SetInt(keyName, dict.Count);
            var keys = dict.Keys;
            int index = 0;
            foreach (var key in dict.Keys)
            {
                SaveValue(keyName + "_" + index + "_" + "key", key);
                SaveValue(keyName + "_" + index + "_" + "value", dict[key]);
                index++;
            }
        }
        else
        {
            SaveData(value, keyName);
        }
    }

    /// <summary>
    /// 把数据从PlayerPrefs取出
    /// </summary>
    /// <param name="type"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    private object GetValue(Type type, string key)
    {

        if (type == typeof(string)) return PlayerPrefs.GetString(key);
        else if (type == typeof(int)) return PlayerPrefs.GetInt(key);
        else if (type == typeof(float)) return PlayerPrefs.GetFloat(key);
        else if (type == typeof(bool)) return PlayerPrefs.GetInt(key) == 1;
        else if (typeof(IList).IsAssignableFrom(type))
        {
            IList list = Activator.CreateInstance(type) as IList;
            for (int i = 0; i < PlayerPrefs.GetInt(key); i++)
            {
                list.Add(GetValue(type.GetGenericArguments()[0], key + "_" + i));
            }
            return list;
        }
        else if (typeof(IDictionary).IsAssignableFrom(type))
        {
            IDictionary dict = Activator.CreateInstance(type) as IDictionary;
            Type keyType = type.GetGenericArguments()[0];
            Type valueType = type.GetGenericArguments()[1];
            for (int i = 0; i < PlayerPrefs.GetInt(key); i++)
            {
                dict.Add(GetValue(keyType, key + "_" + i + "_" + "key"), GetValue(valueType, key + "_" + i + "_" + "value"));
            }
            return dict;
        }
        else
        {
            return GetData(type, key);
        }
    }
}