-
Notifications
You must be signed in to change notification settings - Fork 4
/
CouchDocument.cs
79 lines (66 loc) · 1.81 KB
/
CouchDocument.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace SineSignal.Ottoman
{
internal class CouchDocument : Dictionary<string, object>, IDictionary<string, object>
{
public static CouchDocument Dehydrate(object entity, PropertyInfo identityProperty, string revision, bool delete)
{
var couchDocument = new CouchDocument();
var entityType = entity.GetType();
if (delete)
{
couchDocument["_id"] = entityType.GetProperty(identityProperty.Name).GetValue(entity, null);
couchDocument["_rev"] = revision;
couchDocument["_deleted"] = true;
}
else
{
couchDocument["Type"] = entityType.Name;
if (revision != String.Empty)
couchDocument["_rev"] = revision;
foreach (PropertyInfo property in entityType.GetProperties().Where(p => p.CanRead))
{
var key = property.Name;
if (key == identityProperty.Name)
key = "_id";
var propertyValue = property.GetValue(entity, null);
couchDocument[key] = propertyValue;
}
}
return couchDocument;
}
public T Hydrate<T>(PropertyInfo identityProperty) where T : new()
{
var instance = new T();
var instanceType = instance.GetType();
foreach (KeyValuePair<string, object> pair in this)
{
if (pair.Key == "_rev")
continue;
if (pair.Key == "Type")
continue;
PropertyInfo property;
if (pair.Key == "_id")
{
property = instanceType.GetProperty(identityProperty.Name);
}
else
{
property = instanceType.GetProperty(pair.Key);
}
if (property.PropertyType == typeof(Guid))
{
property.SetValue(instance, new Guid(pair.Value.ToString()), null);
}
else
{
property.SetValue(instance, pair.Value, null);
}
}
return instance;
}
}
}