using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; namespace Cryville.Common.Plist { public class PlistConvert { public static T Deserialize(string file) { return (T)Deserialize(typeof(T), PlistCS.Plist.readPlist(file)); } public static object Deserialize(Type type, object obj, Binder binder = null) { if (binder == null) binder = BinderAttribute.CreateBinderOfType(type); if (obj is IList) { var lobj = (List)obj; foreach (var i in lobj) { throw new NotImplementedException(); // TODO } } else if (obj is IDictionary) { var dobj = (Dictionary)obj; if (typeof(IDictionary).IsAssignableFrom(type)) { var result = (IDictionary)ReflectionHelper.InvokeEmptyConstructor(type); var it = type.GetGenericArguments()[1]; foreach (var i in dobj) { var value = Deserialize(it, i.Value, binder); result.Add(i.Key, value); } return result; } else { var result = ReflectionHelper.InvokeEmptyConstructor(type); foreach (var i in dobj) { var imis = type.GetMember(i.Key); if (imis.Length == 0) continue; var imi = imis[0]; var it = ReflectionHelper.GetMemberType(imi); var value = Deserialize(it, i.Value, binder); ReflectionHelper.SetValue(imi, result, value, binder); } return result; } } else return obj; throw new Exception(); // TODO } } }