using CommonLang.Property; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace CommonAIServer { public static class ServerUtils { public static object DynamicToObject(dynamic src, object dst) { var dtype = dst.GetType(); if (dtype.IsPrimitive || dtype.IsAssignableFrom(typeof(string))) { return src; } foreach (var f in dtype.GetFields()) { try { dynamic sfv = src[f.Name]; if (sfv != null) { if (f.FieldType.IsPrimitive || f.FieldType.IsAssignableFrom(typeof(string))) { f.SetValue(dst, sfv); } else if (f.FieldType.IsEnum) { var dfv = Enum.Parse(f.FieldType, sfv.ToString()); f.SetValue(dst, dfv); } else if (f.FieldType.IsArray) { ArrayList temp = new ArrayList(); var elementType = f.FieldType.GetElementType(); foreach (dynamic sitem in sfv) { var ditem = ReflectionUtil.CreateInstance(elementType); ditem = DynamicToObject(sitem, ditem); temp.Add(ditem); } Array dfv = ReflectionUtil.CreateInstance(f.FieldType, temp.Count) as Array; for (int i=0; i < temp.Count; i++) { dfv.SetValue(temp[i], i); } f.SetValue(dst, dfv); } else if (f.FieldType.GetInterface(typeof(IList).Name) != null) { var dfv = ReflectionUtil.CreateInstance(f.FieldType) as IList; var elementType = f.FieldType.GetGenericArguments()[0]; foreach (dynamic sitem in sfv) { var ditem = ReflectionUtil.CreateInstance(elementType); ditem = DynamicToObject(sitem, ditem); dfv.Add(ditem); } f.SetValue(dst, dfv); } else { var dfv = ReflectionUtil.CreateInstance(f.FieldType); dfv = DynamicToObject(sfv, dfv); f.SetValue(dst, dfv); } } } catch (Exception err) { Console.WriteLine(err.Message); } } return dst; } } }