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