public void Encode(System.IO.Stream stream, WADL.WADLRepresentation param, object value)
        {
            switch (System.Type.GetTypeCode(value.GetType()))
            {
                case TypeCode.SByte:
                case TypeCode.Byte:
                    stream.WriteByte((byte)value);
                    break;
                case TypeCode.Object:
                    if (value is Byte[])
                    {
                        byte[] bytes = (byte[])value;
                        stream.Write(bytes, 0, bytes.Length);
                    }
                    else
                    {
                        StreamWriter objWriter = new StreamWriter(stream);
                        objWriter.AutoFlush = true;
                        objWriter.Write(value.ToString());
                    }
                    break;
                case TypeCode.Empty:
                case TypeCode.DBNull:
                    break;
                case TypeCode.Char:
                case TypeCode.UInt16:
                case TypeCode.UInt32:
                case TypeCode.UInt64:
                case TypeCode.Boolean:
                case TypeCode.Int16:
                case TypeCode.Int32:
                case TypeCode.Int64:
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                case TypeCode.DateTime:
                case TypeCode.String:
                default:
                    StreamWriter defaultWriter = new StreamWriter(stream);
                    defaultWriter.AutoFlush = true;
                    defaultWriter.Write(value.ToString());

                    break;
            }

        }
 public object Decode(WADL.WADLParam param, object value)
 {
     switch (System.Type.GetTypeCode(param.ParameterInfo.ParameterType))
     {
         case TypeCode.Char:
             return System.Convert.ToChar(value);
         case TypeCode.SByte:
             return System.Convert.ToSByte(value);
         case TypeCode.UInt16:
             return System.Convert.ToUInt16(value);
         case TypeCode.UInt32:
             return System.Convert.ToUInt32(value);
         case TypeCode.UInt64:
             return System.Convert.ToUInt64(value); ;
         case TypeCode.Boolean:
             return System.Convert.ToBoolean(value);
         case TypeCode.Byte:
             return System.Convert.ToByte(value); //?
         case TypeCode.Int16:
             return System.Convert.ToInt16(value);
         case TypeCode.Int32:
             return System.Convert.ToInt32(value);
         case TypeCode.Int64:
             return System.Convert.ToInt64(value);
         case TypeCode.Single:
             return System.Convert.ToSingle(value);
         case TypeCode.Double:
             return System.Convert.ToDouble(value);
         case TypeCode.Decimal:
             return System.Convert.ToDecimal(value);
         case TypeCode.DateTime:
             return System.Convert.ToDateTime(value);
         case TypeCode.String:
             return System.Convert.ToString(value); //can be any type in the event of a mismatch the app must catch it 
         case TypeCode.Object:
             var cast = param.ParameterInfo.ParameterType.GetMethods(System.Reflection.BindingFlags.Static|System.Reflection.BindingFlags.Public).Where(m => m.ReturnType == param.ParameterInfo.ParameterType).Single();
             return cast.Invoke(null, new[]{ value });
         case TypeCode.Empty:
         case TypeCode.DBNull:
         default:
             throw new NotSupportedException(String.Format("datatype {0}", param.ParameterInfo.ParameterType.Name));
     }
 }