Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableAttribute.cs @ 1893

Last change on this file since 1893 was 1893, checked in by epitzer, 15 years ago

Avoid recompiling regex during string parsing and cache storable attribues for faster saving. (#646)

File size: 2.8 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Reflection;
4
5namespace 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}
Note: See TracBrowser for help on using the repository browser.