Salvare lo stato di un oggetto (store e restore)...

Una classe e un attributo per salvare lo stato di un oggetto... è come serialiazzarlo se vogliamo, ma viene incontro al pattern Memento :p ...mi sembra interessante... con calma capisco se lo è :p
[AttributeUsage(AttributeTargets.Field, AllowMultiple =false)]
public class FieldStateAttribute: Attribute 
{
 private bool _ignore = false;
 public FieldStateAttribute(){;}
 public bool Ignore{
  get{return _ignore;}
  set{_ignore = value;}
 }
}
[Serializable]
public class ObjectState
{
 [Serializable]
 class FieldState{
  public FieldInfo Field;
  public object Value;
 }
 static BindingFlags bindingAttr = 
  BindingFlags.GetField|BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public;
 ArrayList _fields;
 public ObjectState(){;}
 public void Store(object target)
 {
  _fields = new ArrayList();
  Type t = target.GetType();
  foreach(FieldInfo f in t.GetFields(bindingAttr))
  {
   //Controllo se sono impostati attributi di stato del campo...
   FieldStateAttribute attr = 
    Attribute.GetCustomAttribute(f, typeof(FieldStateAttribute))
    as FieldStateAttribute;
   if(attr != null){
    //...lo stato del campo deve essere ignorato?
    if(attr.Ignore) continue; 
   }
   FieldState s = new FieldState();    
   s.Field = f;
   s.Value = f.GetValue(target);
   _fields.Add(s);
  }
 }
 public void Retore(object target) 
 {
  Type t = target.GetType();
  foreach(FieldState s in _fields){
   s.Field.SetValue(target, s.Value);
  }
 }
}

Testing code...
class TestClass{
 string privateString;
 public TestClass(string s){
  privateString = s;
 }
 public override string ToString() {
  return privateString;
 }
}
 
public static void ObjectStateTest(){
 TestClass c = new TestClass("PIPPO");
 ObjectState state = new ObjectState();
 state.Store(c);
 TestClass c1 = new TestClass("TOPOLINO");
 Console.WriteLine(c1);
 state.Retore(c1);
 Console.WriteLine(c1);
}
by Me

posted @ venerdì 20 febbraio 2004 16:47

Print
Comments have been closed on this topic.
«novembre»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011