public bool Set(Func <T, T> factory, Action <T, T> postUpdateAction = null) { var old = _value == null ? default(T) : _value.Value; var value = factory(old); if (Equals(old, value)) { return(false); } if (value != null && old != null && value.GetType().IsArray) { var a1 = (old as Array).Cast <object>().ToArray(); var a2 = (value as Array).Cast <object>().ToArray(); if (a1.Length == a2.Length) { var eq = !a1.Where((t, i) => !Equals(t, a2[i])).Any(); if (eq) { return(false); } } } _value = new BoxedLazySet(this, factory, value); postUpdateAction?.Invoke(old, value); return(true); }
public T Get(Func <T, T> factory, Action <T, T> postUpdateAction = null) { if (_value == null) { _value = new BoxedLazy(this, factory, default(T)); } return(_value.Value); }
public void SetGetter(Func <T, T> valueFactory, T oldValue = default(T)) { if (_value == null) { if (oldValue == null) { _value = new BoxedLazy(this, valueFactory, oldValue); } else { _value = new BoxedLazySet(this, valueFactory, oldValue); } } }