Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Persistence/Default/Decomposers/StorableDecomposer.cs @ 1494

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

merge persistence exploration branch into trunk as HL plugin. (#506)

File size: 1.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using HeuristicLab.Persistence.Interfaces;
5using HeuristicLab.Persistence.Core;
6
7namespace HeuristicLab.Persistence.Default.Decomposers {
8
9  public class StorableDecomposer : IDecomposer {   
10
11    public bool CanDecompose(Type type) {
12      return StorableAttribute.GetStorableMembers(type, false).Count() > 0 ||
13        EmptyStorableClassAttribute.IsEmpyStorable(type);
14
15    }   
16
17    public IEnumerable<Tag> DeCompose(object obj) {
18      foreach (var mapping in StorableAttribute.GetAutostorableAccessors(obj)) {
19        yield return new Tag(mapping.Key, mapping.Value.Get());
20      }
21    }
22
23    public object CreateInstance(Type type) {
24      return Activator.CreateInstance(type, true);
25    }
26
27    public object Populate(object instance, IEnumerable<Tag> objects, Type type) {           
28      var memberDict = new Dictionary<string, Tag>();     
29      IEnumerator<Tag> iter = objects.GetEnumerator();     
30      while (iter.MoveNext()) {
31        memberDict.Add(iter.Current.Name, iter.Current);
32      }     
33      foreach (var mapping in StorableAttribute.GetAutostorableAccessors(instance)) {
34        if (memberDict.ContainsKey(mapping.Key)) {
35          memberDict[mapping.Key].SafeSet(mapping.Value.Set);
36        } else if (mapping.Value.DefaultValue != null) {
37          mapping.Value.Set(mapping.Value.DefaultValue);
38        }
39      }
40      return instance;
41    }
42
43  }
44}
Note: See TracBrowser for help on using the repository browser.