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)); }
public void AddState(string name, ObjectState state) { _states.Add(name, state); }