using System; using System.Collections; using System.Collections.Generic; using System.Dynamic; namespace Framework.Shared.Abstraction { public abstract class Packet { public abstract void LoadData(ExpandoObject data); protected T Convert(ExpandoObject prop, string variable) { var dict = (IDictionary)prop; return (T)Convert(dict[variable], typeof(T)); } protected List ConvertList(ExpandoObject prop, string variable) { var dict = (IDictionary)prop; return (List)Convert(dict[variable], typeof(T)); } protected T[] ConvertArray(ExpandoObject prop, string variable) { return ConvertList(prop, variable).ToArray(); } private object Convert(object prop, Type generic) { var type = prop.GetType(); if (type == typeof(List)) { var rawList = prop as IList ?? new List(); var listType = typeof(List<>).MakeGenericType(generic); var list = Activator.CreateInstance(listType) as IList ?? new List(); foreach (var element in rawList) { list.Add(Convert(element, generic)); } return list; } return System.Convert.ChangeType(prop, generic); } } }