Free cookie consent management tool by TermsFeed Policy Generator

source: branches/New Persistence Exploration/Persistence/Persistence/Core/StorableAttribute.cs @ 1447

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

Implement persistence of storables as decomposer. (#506)

File size: 3.0 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Reflection;
4
5namespace HeuristicLab.Persistence.Core {
6
7 
8  [AttributeUsage(
9    AttributeTargets.Class,
10    AllowMultiple=false,
11    Inherited=false)]
12  public class EmptyStorableClassAttribute : Attribute {
13    private static readonly Dictionary<Type, bool> emptyTypeInfo = new Dictionary<Type, bool>();
14    public static bool IsEmpyStorable(Type type) {     
15      if (emptyTypeInfo.ContainsKey(type))
16        return emptyTypeInfo[type];
17      foreach (var attribute in type.GetCustomAttributes(false)) {
18        EmptyStorableClassAttribute empty = attribute as EmptyStorableClassAttribute;
19        if (empty != null) {
20          emptyTypeInfo.Add(type, true);
21          return true;
22        }
23      }
24      int nFields = 0;
25      foreach ( MemberInfo memberInfo in type.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ) {
26        if (memberInfo.MemberType == MemberTypes.Field ||
27          memberInfo.MemberType == MemberTypes.Property)
28          nFields += 1;
29      }
30      if (nFields == 0) {
31        emptyTypeInfo.Add(type, true);
32        return true;
33      }
34      emptyTypeInfo.Add(type, false);
35      return false;
36    }
37  }
38
39  [AttributeUsage(
40    AttributeTargets.Field | AttributeTargets.Property,
41    AllowMultiple=false,
42    Inherited=false)]
43  public class StorableAttribute : Attribute {
44
45    public string Name { get; set; }
46    public object DefaultValue { get; set; }
47
48    private const BindingFlags instanceMembers =
49      BindingFlags.Instance |
50      BindingFlags.Public |
51      BindingFlags.NonPublic;
52   
53    public static IEnumerable<KeyValuePair<StorableAttribute, MemberInfo>> GetStorableMembers(Type type) {
54      return GetStorableMembers(type, true);     
55    }
56
57    public static IEnumerable<KeyValuePair<StorableAttribute, MemberInfo>>
58        GetStorableMembers(Type type, bool inherited) {
59      if (type.BaseType != null)
60        foreach ( var pair in GetStorableMembers(type.BaseType) )
61          yield return pair;
62      foreach (MemberInfo memberInfo in type.GetMembers(instanceMembers)) {
63        foreach (object attribute in memberInfo.GetCustomAttributes(false)) {         
64          StorableAttribute storableAttribute =
65            attribute as StorableAttribute;
66          if (storableAttribute != null) {
67            yield return new KeyValuePair<StorableAttribute, MemberInfo>(storableAttribute, memberInfo);           
68          }
69        }
70      }     
71    }
72
73    public static Dictionary<string, DataMemberAccessor> GetAutostorableAccessors(object obj) {
74      Dictionary<string, DataMemberAccessor> storableAccessors =
75        new Dictionary<string, DataMemberAccessor>();
76      foreach (KeyValuePair<StorableAttribute, MemberInfo> pair in GetStorableMembers(obj.GetType())) {
77        storableAccessors.Add(pair.Value.Name,
78          new DataMemberAccessor(pair.Value, pair.Key, obj));
79      }           
80      return storableAccessors;
81    }   
82  }
83}
Note: See TracBrowser for help on using the repository browser.