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