CodeInterpreter.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Reflection;
  3. namespace System.Runtime.Serialization
  4. {
  5. public class CodeInterpreter
  6. {
  7. internal static object ConvertValue(object arg, Type source, Type target)
  8. {
  9. return InternalConvert(arg, source, target, false);
  10. }
  11. static bool CanConvert (TypeCode typeCode)
  12. {
  13. switch (typeCode)
  14. {
  15. case TypeCode.Boolean:
  16. case TypeCode.Char:
  17. case TypeCode.SByte:
  18. case TypeCode.Byte:
  19. case TypeCode.Int16:
  20. case TypeCode.UInt16:
  21. case TypeCode.Int32:
  22. case TypeCode.UInt32:
  23. case TypeCode.Int64:
  24. case TypeCode.UInt64:
  25. case TypeCode.Single:
  26. case TypeCode.Double:
  27. return true;
  28. }
  29. return false;
  30. }
  31. static object InternalConvert(object arg, Type source, Type target, bool isAddress)
  32. {
  33. if (target == source)
  34. return arg;
  35. if (target.IsValueType)
  36. {
  37. if (source.IsValueType)
  38. {
  39. if (!CanConvert (Type.GetTypeCode (target)))
  40. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.NoConversionPossibleTo, DataContract.GetClrTypeFullName(target))));
  41. else
  42. return target;
  43. }
  44. else if (source.IsAssignableFrom(target))
  45. return arg;
  46. else
  47. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.IsNotAssignableFrom, DataContract.GetClrTypeFullName(target), DataContract.GetClrTypeFullName(source))));
  48. }
  49. else if (target.IsAssignableFrom(source))
  50. return arg;
  51. else if (source.IsAssignableFrom(target))
  52. return arg;
  53. else if (target.IsInterface || source.IsInterface)
  54. return arg;
  55. else
  56. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.IsNotAssignableFrom, DataContract.GetClrTypeFullName(target), DataContract.GetClrTypeFullName(source))));
  57. }
  58. public static object GetMember (MemberInfo memberInfo, object instance)
  59. {
  60. var pi = memberInfo as PropertyInfo;
  61. if (pi != null)
  62. return pi.GetValue (instance);
  63. else
  64. return ((FieldInfo) memberInfo).GetValue (instance);
  65. }
  66. public static void SetMember (MemberInfo memberInfo, object instance, object value)
  67. {
  68. var pi = memberInfo as PropertyInfo;
  69. if (pi != null)
  70. pi.SetValue (instance, value);
  71. else
  72. ((FieldInfo) memberInfo).SetValue (instance, value);
  73. }
  74. }
  75. }