-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathModelObject.cs
executable file
·80 lines (62 loc) · 2.02 KB
/
ModelObject.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.Collections;
using System.Collections.Generic;
using System.Dynamic;
namespace ResourceExtractor;
internal class ModelObject : DynamicObject, IEnumerable<KeyValuePair<string, object>> {
private readonly IDictionary<string, object> map = new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result) =>
map.TryGetValue(binder.Name, out result);
public override bool TrySetMember(SetMemberBinder binder, object value) {
if (value != null) {
map[binder.Name] = value;
} else {
map.Remove(binder.Name);
}
return true;
}
public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) {
result = null;
return indexes.Length == 1 && indexes[0] is string name && map.TryGetValue(name, out result);
}
public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) {
if (indexes.Length != 1 || indexes[0] is not string name) {
return false;
}
if (value != null) {
map[name] = value;
} else {
map.Remove(name);
}
return true;
}
public override bool TryDeleteMember(DeleteMemberBinder binder) {
map.Remove(binder.Name);
return true;
}
public override bool TryDeleteIndex(DeleteIndexBinder binder, object[] indexes) {
if (indexes.Length != 1 || indexes[0] is not string name) {
return false;
}
map.Remove(name);
return true;
}
public void Add(string key, object value) =>
map.Add(key, value);
public void Add(KeyValuePair<string, object> item) =>
map.Add(item);
public void Remove(string key) =>
map.Remove(key);
public void Remove(KeyValuePair<string, object> item) =>
map.Remove(item);
public void Merge(ModelObject other) {
foreach (var pair in other) {
map[pair.Key] = pair.Value;
}
}
public bool ContainsKey(string key) =>
map.ContainsKey(key);
IEnumerator<KeyValuePair<string, object>> IEnumerable<KeyValuePair<string, object>>.GetEnumerator() =>
map.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() =>
map.GetEnumerator();
}