ServerUtils.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using CommonLang.Property;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. namespace CommonAIServer
  8. {
  9. public static class ServerUtils
  10. {
  11. public static object DynamicToObject(dynamic src, object dst)
  12. {
  13. var dtype = dst.GetType();
  14. if (dtype.IsPrimitive || dtype.IsAssignableFrom(typeof(string)))
  15. {
  16. return src;
  17. }
  18. foreach (var f in dtype.GetFields())
  19. {
  20. try
  21. {
  22. dynamic sfv = src[f.Name];
  23. if (sfv != null)
  24. {
  25. if (f.FieldType.IsPrimitive || f.FieldType.IsAssignableFrom(typeof(string)))
  26. {
  27. f.SetValue(dst, sfv);
  28. }
  29. else if (f.FieldType.IsEnum)
  30. {
  31. var dfv = Enum.Parse(f.FieldType, sfv.ToString());
  32. f.SetValue(dst, dfv);
  33. }
  34. else if (f.FieldType.IsArray)
  35. {
  36. ArrayList temp = new ArrayList();
  37. var elementType = f.FieldType.GetElementType();
  38. foreach (dynamic sitem in sfv)
  39. {
  40. var ditem = ReflectionUtil.CreateInstance(elementType);
  41. ditem = DynamicToObject(sitem, ditem);
  42. temp.Add(ditem);
  43. }
  44. Array dfv = ReflectionUtil.CreateInstance(f.FieldType, temp.Count) as Array;
  45. for (int i=0; i < temp.Count; i++)
  46. {
  47. dfv.SetValue(temp[i], i);
  48. }
  49. f.SetValue(dst, dfv);
  50. }
  51. else if (f.FieldType.GetInterface(typeof(IList).Name) != null)
  52. {
  53. var dfv = ReflectionUtil.CreateInstance(f.FieldType) as IList;
  54. var elementType = f.FieldType.GetGenericArguments()[0];
  55. foreach (dynamic sitem in sfv)
  56. {
  57. var ditem = ReflectionUtil.CreateInstance(elementType);
  58. ditem = DynamicToObject(sitem, ditem);
  59. dfv.Add(ditem);
  60. }
  61. f.SetValue(dst, dfv);
  62. }
  63. else
  64. {
  65. var dfv = ReflectionUtil.CreateInstance(f.FieldType);
  66. dfv = DynamicToObject(sfv, dfv);
  67. f.SetValue(dst, dfv);
  68. }
  69. }
  70. }
  71. catch (Exception err)
  72. {
  73. Console.WriteLine(err.Message);
  74. }
  75. }
  76. return dst;
  77. }
  78. }
  79. }