1 | using System;
|
---|
2 | using System.Collections.Generic;
|
---|
3 | using System.Reflection;
|
---|
4 |
|
---|
5 | namespace HeuristicLab.Persistence.Default.CompositeSerializers.Storable {
|
---|
6 |
|
---|
7 | [AttributeUsage(
|
---|
8 | AttributeTargets.Field | AttributeTargets.Property,
|
---|
9 | AllowMultiple = false,
|
---|
10 | Inherited = false)]
|
---|
11 | public class StorableAttribute : Attribute {
|
---|
12 |
|
---|
13 | public string Name { get; set; }
|
---|
14 | public object DefaultValue { get; set; }
|
---|
15 |
|
---|
16 | private const BindingFlags instanceMembers =
|
---|
17 | BindingFlags.Instance |
|
---|
18 | BindingFlags.Public |
|
---|
19 | BindingFlags.NonPublic |
|
---|
20 | BindingFlags.DeclaredOnly;
|
---|
21 |
|
---|
22 | private static Dictionary<KeyValuePair<Type, bool>, IEnumerable<KeyValuePair<StorableAttribute, MemberInfo>>> memberCache =
|
---|
23 | new Dictionary<KeyValuePair<Type, bool>, IEnumerable<KeyValuePair<StorableAttribute, MemberInfo>>>();
|
---|
24 |
|
---|
25 | public static IEnumerable<KeyValuePair<StorableAttribute, MemberInfo>> GetStorableMembers(Type type) {
|
---|
26 | return GetStorableMembers(type, true);
|
---|
27 | }
|
---|
28 |
|
---|
29 | public static IEnumerable<KeyValuePair<StorableAttribute, MemberInfo>>
|
---|
30 | GetStorableMembers(Type type, bool inherited) {
|
---|
31 | var query = new KeyValuePair<Type, bool>(type, inherited);
|
---|
32 | if (memberCache.ContainsKey(query))
|
---|
33 | return memberCache[query];
|
---|
34 | IEnumerable<KeyValuePair<StorableAttribute, MemberInfo>> storablesMembers = GenerateStorableMembers(type, inherited);
|
---|
35 | memberCache[query] = storablesMembers;
|
---|
36 | return storablesMembers;
|
---|
37 | }
|
---|
38 |
|
---|
39 | public static IEnumerable<KeyValuePair<StorableAttribute, MemberInfo>>
|
---|
40 | GenerateStorableMembers(Type type, bool inherited) {
|
---|
41 | List<KeyValuePair<StorableAttribute, MemberInfo>> storableMembers =
|
---|
42 | new List<KeyValuePair<StorableAttribute, MemberInfo>>();
|
---|
43 | if (inherited && type.BaseType != null)
|
---|
44 | storableMembers.AddRange(GenerateStorableMembers(type.BaseType, true));
|
---|
45 | foreach (MemberInfo memberInfo in type.GetMembers(instanceMembers)) {
|
---|
46 | foreach (object attribute in memberInfo.GetCustomAttributes(false)) {
|
---|
47 | StorableAttribute storableAttribute =
|
---|
48 | attribute as StorableAttribute;
|
---|
49 | if (storableAttribute != null) {
|
---|
50 | storableMembers.Add(new KeyValuePair<StorableAttribute, MemberInfo>(storableAttribute, memberInfo));
|
---|
51 | }
|
---|
52 | }
|
---|
53 | }
|
---|
54 | return storableMembers;
|
---|
55 | }
|
---|
56 |
|
---|
57 | public static Dictionary<string, DataMemberAccessor> GetStorableAccessors(object obj) {
|
---|
58 | Dictionary<string, DataMemberAccessor> storableAccessors =
|
---|
59 | new Dictionary<string, DataMemberAccessor>();
|
---|
60 | foreach (KeyValuePair<StorableAttribute, MemberInfo> pair in GetStorableMembers(obj.GetType())) {
|
---|
61 | storableAccessors.Add(pair.Value.Name,
|
---|
62 | new DataMemberAccessor(pair.Value, pair.Key, obj));
|
---|
63 | }
|
---|
64 | return storableAccessors;
|
---|
65 | }
|
---|
66 | }
|
---|
67 | }
|
---|