static JSSerializer.UnitType GetUnitType(Type type, object value) { if (sDict == null) { sDict = new Dictionary <Type, JSSerializer.UnitType>(); sDict.Add(typeof(Boolean), JSSerializer.UnitType.ST_Boolean); sDict.Add(typeof(Byte), JSSerializer.UnitType.ST_Byte); sDict.Add(typeof(SByte), JSSerializer.UnitType.ST_SByte); sDict.Add(typeof(Char), JSSerializer.UnitType.ST_Char); sDict.Add(typeof(Int16), JSSerializer.UnitType.ST_Int16); sDict.Add(typeof(UInt16), JSSerializer.UnitType.ST_UInt16); sDict.Add(typeof(Int32), JSSerializer.UnitType.ST_Int32); sDict.Add(typeof(UInt32), JSSerializer.UnitType.ST_UInt32); sDict.Add(typeof(Int64), JSSerializer.UnitType.ST_Int64); sDict.Add(typeof(UInt64), JSSerializer.UnitType.ST_UInt64); sDict.Add(typeof(Single), JSSerializer.UnitType.ST_Single); sDict.Add(typeof(Double), JSSerializer.UnitType.ST_Double); sDict.Add(typeof(String), JSSerializer.UnitType.ST_String); } if (type.IsEnum) { return(JSSerializer.UnitType.ST_Enum); } Type valueType = (value != null ? value.GetType() : type); if ( ((typeof(UnityEngine.MonoBehaviour).IsAssignableFrom(type)) && WillTypeBeTranslatedToJavaScript(type)) || // 2015/10/23 // 其实这个函数应该总是取 valueType 来判断 // 怕出 bug,这里先特殊支持,当 type == MonoBehaviour 时,才检查 valueType ((typeof(UnityEngine.MonoBehaviour) == type) && WillTypeBeTranslatedToJavaScript(valueType)) ) { return(JSSerializer.UnitType.ST_JavaScriptMonoBehaviour); } if ((typeof(UnityEngine.Object).IsAssignableFrom(type))) { return(JSSerializer.UnitType.ST_UnityEngineObject); } JSSerializer.UnitType ret = JSSerializer.UnitType.ST_Unknown; if (!sDict.TryGetValue(type, out ret)) { // Debug.LogError("GetIndex: Unknown type: " + type.Name); return(JSSerializer.UnitType.ST_Unknown); } return(ret); }
public JSSerializer.UnitType unitType; // Unit type, it's useless when analyzeType == xxBegin xxObj xxEnd public AnalyzeStructInfo(JSSerializer.AnalyzeType at, string name, Type type, object v = null, JSSerializer.UnitType ut = JSSerializer.UnitType.ST_Unknown) { analyzeType = at; Name = name; this.type = type; value = v; unitType = ut; eSerialize = SerializeType.String; }
public static int AddAnalyze(Type type, string name, object value, int index = -1) { if (index == -1) { index = lstAnalyze.Count; } JSSerializer.UnitType unitType = GetUnitType(type, value); if (unitType != JSSerializer.UnitType.ST_Unknown) { lstAnalyze.Insert(index, new AnalyzeStructInfo(JSSerializer.AnalyzeType.Unit, name, type, value, unitType)); return(1); } else { if (type.IsArray) { lstAnalyze.Insert(index++, new AnalyzeStructInfo(JSSerializer.AnalyzeType.ArrayBegin, name, type)); lstAnalyze.Insert(index++, new AnalyzeStructInfo(JSSerializer.AnalyzeType.ArrayObj, name, type, value)); lstAnalyze.Insert(index++, new AnalyzeStructInfo(JSSerializer.AnalyzeType.ArrayEnd, name, type)); return(3); } else if (type.IsClass || type.IsValueType) { if (value == null) { return(0); } lstAnalyze.Insert(index++, new AnalyzeStructInfo(JSSerializer.AnalyzeType.StructBegin, name, type)); lstAnalyze.Insert(index++, new AnalyzeStructInfo(JSSerializer.AnalyzeType.StructObj, name, type, value)); lstAnalyze.Insert(index++, new AnalyzeStructInfo(JSSerializer.AnalyzeType.StructEnd, name, type)); return(3); } else if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List <>)) { lstAnalyze.Insert(index++, new AnalyzeStructInfo(JSSerializer.AnalyzeType.ListBegin, name, type)); lstAnalyze.Insert(index++, new AnalyzeStructInfo(JSSerializer.AnalyzeType.ListObj, name, type, value)); lstAnalyze.Insert(index++, new AnalyzeStructInfo(JSSerializer.AnalyzeType.ListEnd, name, type)); return(3); } } return(0); }
public AnalyzeStructInfo(JSSerializer.AnalyzeType at, string name, Type type, object v = null, JSSerializer.UnitType ut = JSSerializer.UnitType.ST_Unknown) { analyzeType = at; Name = name; this.type = type; value = v; unitType = ut; eSerialize = SerializeType.String; }