using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using XRTool.Util;
namespace PublicTools.XMLDataBase
{
///
/// 类的解析,主要做两件事,拆包/封包
/// 拆包:将类的成员变量拆成Dictionary
///
///
public static class ClazzFactory
{
///
/// 给定一个成员变量,获取bi
///
///
///
public static string GetPriKey(T t, string priKey)
{
if (t == null)
{
UnityLog.LogError(typeof(T) + " is null" + priKey);
}
if (string.IsNullOrEmpty(priKey))
{
UnityLog.LogError(typeof(T) + "prikey is null:" + priKey);
}
var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Instance);
if (fields == null || fields.Length < 1)
{
priKey=JsonConvert.SerializeObject(t.GetType().GetProperty(priKey).GetValue(t, null)).Replace("\"", "");
}
else
{
priKey = JsonConvert.SerializeObject(t.GetType().GetField(priKey).GetValue(t)).Replace("\"", "");
}
return priKey;
}
///
/// 拆包
/// 使用反射和Json解析对象
/// 默认解析公共成员变量(属性)
/// 当不存在公共成员变量时,解析公共方法
/// 二者只能存一
/// 不解析Dictionary类型
///
///
///
///
public static Dictionary ClazzAnalyze(T t)
{
Dictionary field = new Dictionary();
if (t == null)
{
t = default(T);
}
if (t != null)
{
///解析成员变量
var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Instance);
bool isHas = false;
///存在成员变量时
if (fields != null && fields.Length > 0)
{
for (int i = 0; i < fields.Length; i++)
{
if (fields[i].FieldType.ToString().Contains("Dictionary"))
{
continue;
}
string value = "";
string key = fields[i].Name;
try
{
value = JsonConvert.SerializeObject(t.GetType().GetField(key).GetValue(t)).Replace("\"", "");
}
catch (Exception ex)
{
///解包错误,无法解析类型
Debug.LogError(ex.ToString() + typeof(T).Name + "--" + fields[i].Name + " is error value");
}
field.Add(key, value);
isHas = true;
}
}
if (!isHas)
{
///不存在成员变量,检测公共赋值方法
var property = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
if (property != null && property.Length > 0)
{
for (int i = 0; i < property.Length; i++)
{
if (property[i].PropertyType.ToString().Contains("Dictionary"))
{
continue;
}
string value = "";
string key = property[i].Name;
try
{
value = JsonConvert.SerializeObject(t.GetType().GetProperty(key).GetValue(t, null)).Replace("\"", "");
}
catch (Exception ex)
{
///解包错误,无法解析类型
Debug.LogError(ex.ToString() + typeof(T).Name + "--" + property[i].Name + " is error value");
}
//Debug.Log(key + value);
field.Add(key, value);
}
}
}
}
else
{
UnityLog.LogError(typeof(T).Name + " is null");
}
return field;
}
///
/// 封包
/// 使用反射和json封装对象
/// 默认赋值公共成员变量,属性
/// 当不存在可用的成员变量时,赋值公共方法
///
///
///
///
///
public static T ClazzPack(Dictionary field)
{
T t = (T)(Assembly.GetExecutingAssembly().CreateInstance(typeof(T).Namespace + "." + typeof(T).Name));
var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Instance);
bool isHas = false;
///存在成员变量时
if (fields != null && fields.Length > 0)
{
for (int i = 0; i < fields.Length; i++)
{
if (field.ContainsKey(fields[i].Name))
{
object tempArr;
try
{
if (field.ContainsKey(fields[i].Name))
{
string value = field[fields[i].Name];
///Json对象
if (value.StartsWith("{") && value.EndsWith("}"))
{
string realValue = "{";
string nullFlag = value.Replace("{", "").Replace("}", "");
string[] arr = nullFlag.Split(',');
for (int j = 0; j < arr.Length; j++)
{
string[] tmpaar = arr[j].Split(':');
string shuxing = tmpaar[0];
shuxing = "\"" + shuxing + "\"";
realValue += shuxing + ":" + tmpaar[1];
if (j < arr.Length - 1)
{
realValue += ",";
}
}
value = realValue + "}";
}
else if (value.StartsWith("[") && value.EndsWith("]"))
{
string realValue = "[";
string nullFlag = value.Replace("[", "").Replace("]", "");
string[] arr = nullFlag.Split(',');
for (int j = 0; j < arr.Length; j++)
{
realValue += "\"" + arr[j] + "\"";
if (j < arr.Length - 1)
{
realValue += ",";
}
}
value = realValue + "]";
}
else
{
if (!value.StartsWith("\"") && !value.EndsWith("\""))
{
value = "\"" + value + "\"";
}
}
//UnityLog.Log(value);
if (value == "null")
{
tempArr = null;
}
else
{
tempArr = JsonConvert.DeserializeObject(value, fields[i].FieldType);// StringToArr(property[i].PropertyType, field[property[i].Name].Split(new char[] { '|' }));
}
fields[i].SetValue(t, tempArr);
isHas = true;
}
else
{
UnityLog.LogError(fields[i].Name + " is null!");
}
}
catch (Exception ex)
{
///装包失败,打印出具体的错误信息
UnityLog.LogError(ex.ToString() + typeof(T).Name + "--" + fields[i].Name + field[fields[i].Name] + " is error value");
}
}
}
}
if (!isHas)
{
///无有效的成员变量,开始解析赋值公共方法
PropertyInfo[] property = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public);
for (int i = 0; i < property.Length; i++)
{
if (field.ContainsKey(property[i].Name))
{
object tempArr;
try
{
if (field.ContainsKey(property[i].Name))
{
string value = field[property[i].Name];
///Json对象
if (value.StartsWith("{") && value.EndsWith("}"))
{
string realValue = "{";
string nullFlag = value.Replace("{", "").Replace("}", "");
string[] arr = nullFlag.Split(',');
for (int j = 0; j < arr.Length; j++)
{
string[] tmpaar = arr[j].Split(':');
string shuxing = tmpaar[0];
shuxing = "\"" + shuxing + "\"";
realValue += shuxing + ":" + tmpaar[1];
if (j < arr.Length - 1)
{
realValue += ",";
}
}
value = realValue + "}";
}
else
{
if (!value.StartsWith("\"") && !value.EndsWith("\""))
{
value = "\"" + value + "\"";
}
}
//UnityLog.Log(value);
if (value == "null")
{
tempArr = null;
}
else
{
tempArr = JsonConvert.DeserializeObject(value, property[i].PropertyType);// StringToArr(property[i].PropertyType, field[property[i].Name].Split(new char[] { '|' }));
}
property[i].SetValue(t, tempArr, null);
}
else
{
UnityLog.LogError(property[i].Name + " is null!");
}
}
catch (Exception ex)
{
///装包失败,打印出具体的错误信息
UnityLog.LogError(ex.ToString() + typeof(T).Name + "--" + property[i].Name + " is error value");
}
}
}
}
return t;
}
}
}