Statistics
| Branch: | Revision:

root / trunk / hammock / src / net35 / Hammock.Tests / Postmark / Converters / NameValueCollectionConverter.cs @ 0eea575a

History | View | Annotate | Download (2 kB)

1
using System;
2
using System.Collections.Specialized;
3
using System.Linq;
4
using Newtonsoft.Json;
5

    
6
namespace Hammock.Tests.Postmark.Converters
7
{
8
    internal class NameValuePair
9
    {
10
        public string Name { get; set; }
11
        public string Value { get; set; }
12
    }
13

    
14
    internal class NameValueCollectionConverter : JsonConverter
15
    {
16
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
17
        {
18
            if (!(value is NameValueCollection))
19
            {
20
                return;
21
            }
22

    
23
            var collection = (NameValueCollection)value;
24
            var container = collection.AllKeys.Select(key => new NameValuePair
25
                                                                 {
26
                                                                     Name = key,
27
                                                                     Value = collection[key]
28
                                                                 }).ToList();
29

    
30
            var serialized = JsonConvert.SerializeObject(container);
31

    
32
            writer.WriteRawValue(serialized);
33
        }
34

    
35
        public override object ReadJson(JsonReader reader, Type objectType, object originalValue, JsonSerializer serializer)
36
        {
37
            return reader.Value;
38
        }
39

    
40
        public override bool CanConvert(Type objectType)
41
        {
42
            var t = (IsNullableType(objectType))
43
                        ? Nullable.GetUnderlyingType(objectType)
44
                        : objectType;
45

    
46
            return typeof(NameValueCollection).IsAssignableFrom(t);
47
        }
48

    
49
        public static bool IsNullable(Type type)
50
        {
51
            return type != null && (!type.IsValueType || IsNullableType(type));
52
        }
53

    
54
        public static bool IsNullableType(Type type)
55
        {
56
            if (type == null)
57
            {
58
                return false;
59
            }
60

    
61
            return (type.IsGenericType &&
62
                    type.GetGenericTypeDefinition() == typeof(Nullable<>));
63
        }
64
    }
65
}
66

    
67