public ObjectState GetState()
        {
            ObjectState objState = new ObjectState();

            TraverseObjectGraph(GetType(), objState, GetFieldState, GetPropertyState);

            return objState;
        }
        private static void TraverseObjectGraph(Type t, 
            ObjectState objState,
            Action<FieldInfo, ObjectState> fieldPredicate,
            Action<PropertyInfo, ObjectState> propPredicate)
        {
            t.GetProperties()
                .Where(p => p.GetCustomAttribute<MarkAttribute>() != null)
                .ForEach(p => propPredicate(p, objState));

            t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                .Where(f => f.GetCustomAttribute<MarkAttribute>() != null)
                .ForEach(f => fieldPredicate(f, objState));
        }
 private void GetFieldState(FieldInfo field, ObjectState objState)
 {
     if (field.FieldType.IsSubclassOf(_self))
     {
         var value = field.GetValue(this);
         objState.AddState(field.Name, (ObjectState)value.GetType().GetMethod("GetState").Invoke(value, null));
     }
     else objState.AddField(field.Name, field.GetValue(this));
 }
 private void SetPropertyState(PropertyInfo prop, ObjectState objState)
 {
     if (prop.PropertyType.IsSubclassOf(_self))
     {
         var value = prop.GetValue(this);
         prop.PropertyType.GetMethod("SetState").Invoke(value, new object[]{ objState.GetState(prop.Name) });
     }
     else prop.SetValue(this, objState.GetProp(prop.Name));
 }
 private void SetFieldState(FieldInfo field, ObjectState objState)
 {
     if (field.FieldType.IsSubclassOf(_self))
     {
         var value = field.GetValue(this);
         value.GetType().GetMethod("SetState").Invoke(value, new object[]{ objState.GetState(field.Name) });
     }
     else field.SetValue(this, objState.GetField(field.Name));
 }
 private void GetPropertyState(PropertyInfo prop, ObjectState objState)
 {
     if (prop.PropertyType.IsSubclassOf(_self))
     {
         var value = prop.GetValue(this);
         objState.AddState(prop.Name, (ObjectState)value.GetType().GetMethod("GetState").Invoke(value, null));
     }
     else objState.AddProp(prop.Name, prop.GetValue(this));
 }
Ejemplo n.º 7
0
 public void AddState(string name, ObjectState state)
 {
     _states.Add(name, state);
 }