Free cookie consent management tool by TermsFeed Policy Generator

Changeset 8212


Ignore:
Timestamp:
07/04/12 13:09:14 (12 years ago)
Author:
mkommend
Message:

#1760: Changed object graph traversal to use a hashset of objects for excluding specific members.

Location:
trunk/sources
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Common/3.3/ObjectExtensions.cs

    r8128 r8212  
    3535    }
    3636
    37     public static IEnumerable<object> GetObjectGraphObjects(this object obj, HashSet<string> excludedMembers = null, bool excludeStaticMembers = false) {
     37    public static IEnumerable<object> GetObjectGraphObjects(this object obj, HashSet<object> excludedMembers = null, bool excludeStaticMembers = false) {
    3838      if (obj == null) return Enumerable.Empty<object>();
    39       if (excludedMembers == null) excludedMembers = new HashSet<string>();
     39      if (excludedMembers == null) excludedMembers = new HashSet<object>();
    4040
    4141      var objects = new HashSet<object>();
     
    7878             (type.HasElementType && ExcludeType(type.GetElementType()));
    7979    }
    80     private static IEnumerable<object> GetChildObjects(object obj, HashSet<string> excludedMembers, bool excludeStaticMembers) {
     80
     81    private static ReferenceEqualityComparer comparer = new ReferenceEqualityComparer();
     82    private static IEnumerable<object> GetChildObjects(object obj, HashSet<object> excludedMembers, bool excludeStaticMembers) {
    8183      Type type = obj.GetType();
    8284
     
    8486        PropertyInfo info = type.GetProperty("Value");
    8587        object value = info.GetValue(obj, null);
    86         if (value != null) yield return value;
     88        if (value != null && excludedMembers.Contains(value, comparer))
     89          yield return value;
    8790      } else if (type.IsSubclassOfRawGeneric(typeof(Dictionary<,>)) ||
    8891           type.IsSubclassOfRawGeneric(typeof(SortedDictionary<,>)) ||
     
    9396           obj is Hashtable) {
    9497        var dictionary = obj as IDictionary;
    95         foreach (object value in dictionary.Keys)
     98        foreach (object value in dictionary.Keys) {
     99          if (excludedMembers.Contains(value, comparer)) continue;
    96100          yield return value;
    97         foreach (object value in dictionary.Values)
     101        }
     102        foreach (object value in dictionary.Values) {
     103          if (excludedMembers.Contains(value, comparer)) continue;
    98104          yield return value;
     105        }
    99106      } else if (type.IsArray || type.IsSubclassOfRawGeneric(typeof(HashSet<>))) {
    100107        var enumerable = obj as IEnumerable;
    101         foreach (var value in enumerable)
     108        foreach (var value in enumerable) {
     109          if (excludedMembers.Contains(value, comparer)) continue;
    102110          yield return value;
     111        }
    103112      } else {
    104113        foreach (FieldInfo f in type.GetAllFields()) {
    105           if (excludedMembers.Contains(f.Name)) continue;
    106114          if (excludeStaticMembers && f.IsStatic) continue;
    107115          object fieldValue;
     
    112120            continue;
    113121          }
     122          if (excludedMembers.Contains(fieldValue, comparer)) continue;
    114123          yield return fieldValue;
    115124        }
  • trunk/sources/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs

    r8155 r8212  
    273273    protected virtual void OnPrepared() {
    274274      ExecutionTime = TimeSpan.Zero;
    275       foreach (IStatefulItem statefulObject in this.GetObjectGraphObjects(new HashSet<string>() { "runs" }).OfType<IStatefulItem>()) {
     275      foreach (IStatefulItem statefulObject in this.GetObjectGraphObjects(new HashSet<object>() { Runs }).OfType<IStatefulItem>()) {
    276276        statefulObject.InitializeState();
    277277      }
     
    294294    public event EventHandler Stopped;
    295295    protected virtual void OnStopped() {
    296       foreach (IStatefulItem statefulObject in this.GetObjectGraphObjects(new HashSet<string>() { "runs" }).OfType<IStatefulItem>()) {
     296      foreach (IStatefulItem statefulObject in this.GetObjectGraphObjects(new HashSet<object>() { Runs }).OfType<IStatefulItem>()) {
    297297        statefulObject.ClearState();
    298298      }
Note: See TracChangeset for help on using the changeset viewer.