You can create a helper class for this, perhaps something like this:
public class OverridableValue<T> { private readonly Func<T> OriginalValueGetter; private Func<T> ValueGetter; public OverridableValue(Func<T> valueGetter) { this.OriginalValueGetter = valueGetter; this.ValueGetter = OriginalValueGetter; } public T Value { get { return ValueGetter(); } } public void SetValueOverride(T value) { if (value == null) ValueGetter = OriginalValueGetter; else ValueGetter = () => value; } }
Usage may look like this:
private static readonly OverridableValue<IThing> _thingManualOverride = new OverridableValue<IThing>(internalThingGetter); public static IThing getTheThing() { return _thingManualOverride.Value; }
If overriding is as simple as:
_thingManualOverride.SetValueOverride(new Thing2());
You can easily replace the null
check in SetValueOverride
with something else, or simply define a new method for RemoveOverride()
, which will help when the null
value is considered a valid override:
public void SetValueOverride(T value) { ValueGetter = () => value; } public void RemoveOverride() { ValueGetter = OriginalValueGetter; }
Another advantage is that this override should (I think) be generally thread safe (you will not be in the case where some IsOverriddenFlag
are true
, but then do not have an override value).
EDIT: you can override the value in the Value
installer, but I thought it would look weird in practice:
public T Value { get { return ValueGetter(); } set { if (value == null) ValueGetter = OriginalValueGetter; else ValueGetter = () => value; } } myThing = _thingManualOverride.Value; //Thing1 _thingManualOverride.Value = new Thing2(); myThing = _thingManualOverride.Value; //Thing2 _thingManualOverride.Value = null; myThing = _thingManualOverride.Value; //Thing1 ... not null!?
source share