using JetBrains.Annotations;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
public class PlayerPrfersMannager
{
private static PlayerPrfersMannager instance = new PlayerPrfersMannager();
public static PlayerPrfersMannager Instance
{ get { return instance; } }
private PlayerPrfersMannager()
{ }
public void SaveData(object obj, string classKey)
{
string KeyName;
Type type = obj.GetType();
FieldInfo[] infos = type.GetFields();
for (int i = 0; i < infos.Length; i++)
{
FieldInfo info = infos[i];
KeyName = classKey + "_" + type.Name +
"_" + info.FieldType.Name + "_" + info.Name;
SetData(KeyName, info.GetValue(obj));
}
}
private void SetData(string keyName, object value)
{
Type fieldType = value.GetType();
if (fieldType == typeof(int))
{
PlayerPrefs.SetInt(keyName, (int)value);
}
else if (fieldType == typeof(string))
{
PlayerPrefs.SetString(keyName, value.ToString());
}
else if (fieldType == typeof(float))
{
PlayerPrefs.SetFloat(keyName, (float)value);
}
else if (fieldType == typeof(bool))
{
PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0);
}
else if (typeof(IList).IsAssignableFrom(fieldType))
{
IList list = value as IList;
PlayerPrefs.SetInt(keyName, list.Count);
int index = 0;
foreach (object obj in list)
{
SetData(keyName + index.ToString(), obj);
index++;
}
}
else if (typeof(IDictionary).IsAssignableFrom(fieldType))
{
IDictionary dict = value as IDictionary;
PlayerPrefs.SetInt(keyName, dict.Count);
int index = 0;
foreach (object obj in dict.Keys)
{
SetData(keyName + "Key" + index, obj);
SetData(keyName + "Value" + index, dict[obj]);
index++;
}
}
else
{
SaveData(value, keyName);
}
}
public object LoadData(Type type, string classKey)
{
object data = Activator.CreateInstance(type);
FieldInfo[] fields = type.GetFields();
String keyName = "";
foreach (FieldInfo field in fields)
{
keyName = classKey + "_" + type.Name +
"_" + field.FieldType.Name + "_" + field.Name;
//根据类型判断用什么API来得到keyName这个键中的值
//把值返回出来
//再通过FieldInfo中的SetValue方法把该值存在我们新创建的object data里面
field.SetValue(data,GetValue(field.FieldType,keyName));
}
return data;
}
public object GetValue(Type fieldType,string keyName)
{
//通过类型来判断用什么API
if (fieldType == typeof(int))
{
return PlayerPrefs.GetInt(keyName);
}
else if (fieldType == typeof(float))
{
return PlayerPrefs.GetFloat(keyName);
}
else if (fieldType == typeof(string))
{
return PlayerPrefs.GetString(keyName, "");
}
else if (fieldType == typeof(bool))
{
return PlayerPrefs.GetInt(keyName, 0) == 1 ? true : false;
}
else if (typeof(IList).IsAssignableFrom(fieldType))
{
int count = PlayerPrefs.GetInt(keyName);
IList list = Activator.CreateInstance(fieldType) as IList;
for (int i = 0; i < count; i++)
{
list.Add(GetValue(fieldType.GetGenericArguments()[0], keyName + i.ToString()));
}
return list;
}
else if (typeof(IDictionary).IsAssignableFrom(fieldType))
{
int count = PlayerPrefs.GetInt(keyName);
IDictionary dictionary = Activator.CreateInstance(fieldType) as IDictionary;
int index = 0;
for (int i = 0; index < count; i++)
{
dictionary.Add(GetValue(fieldType.GetGenericArguments()[0], keyName + "Key" + index),
GetValue(fieldType.GetGenericArguments()[1], keyName + "Value" + index));
index++;
}
return dictionary;
}
else
{
return LoadData(fieldType,keyName);
}
}
}
04-24
705
09-09
249
09-22
210