#region using System.Collections.Generic; using System.Linq; #endregion namespace ScriptSDK { public class CoreObject { internal Dictionary _datatable; public CoreMode Mode { get { return GetValue(CoreAttribut.CoreMode); } set { SetValue(CoreAttribut.CoreMode, value); } } protected void SetValue(CoreAttribut attrib, T value) { if (_datatable.ContainsKey(attrib)) _datatable[attrib] = value; } protected T GetValue(CoreAttribut attrib) { if (attrib.Equals(CoreAttribut.CoreMode)) return (T) _datatable[attrib]; if (!_datatable.ContainsKey(attrib)) return (T) GetRawValue(attrib); if (Mode.Equals(CoreMode.Auto)) _datatable[attrib] = GetRawValue(attrib); return (T) _datatable[attrib]; } protected virtual object GetRawValue(CoreAttribut attrib) { switch (attrib) { case CoreAttribut.CoreMode: return CoreMode.Auto; } return new object(); } public void Update() { if (!Mode.Equals(CoreMode.Auto)) return; var a = _datatable.Keys.ToList(); foreach (var o in a) { var k = o; if (!k.Equals(CoreAttribut.CoreMode)) SetValue(k, GetRawValue(k)); } } protected void Register(CoreAttribut attrib) { if (!_datatable.ContainsKey(attrib)) _datatable.Add(attrib, new object()); } protected void Register(CoreAttribut attrib, T value) { Register(attrib); SetValue(attrib, value); } public T Clone() where T : CoreObject { const CoreAttribut att = CoreAttribut.CoreMode; var val = GetValue(att); if (val.Equals(CoreMode.Auto)) Mode = CoreMode.Clone; var obj = CreateInstance(); foreach (var o in _datatable.Keys) { var k = o; obj._datatable[k] = _datatable[k]; } if (val.Equals(CoreMode.Auto)) Mode = CoreMode.Auto; return (T) obj; } protected virtual CoreObject CreateInstance() { return new CoreObject(); } public override string ToString() { return ""; } public CoreObject() { _datatable = new Dictionary(); Register(CoreAttribut.CoreMode, CoreMode.Auto); } } }