您可以创建一个帮助类来为您执行此操作,可能是这样的:
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;
}
}
用法可能如下所示:
private static readonly OverridableValue<IThing> _thingManualOverride = new OverridableValue<IThing>(internalThingGetter);
public static IThing getTheThing() {
return _thingManualOverride.Value;
}
覆盖它的地方很简单:
_thingManualOverride.SetValueOverride(new Thing2());
您可以轻松地将null
签入换成SetValueOverride
其他东西,或者简单地定义一个新方法,RemoveOverride()
当一个null
值被认为是有效覆盖时会有所帮助:
public void SetValueOverride(T value)
{
ValueGetter = () => value;
}
public void RemoveOverride()
{
ValueGetter = OriginalValueGetter;
}
另一个好处是,这个覆盖应该(我认为)通常是线程安全的(你不会遇到一些IsOverriddenFlag
是true
但没有覆盖值的情况)。
编辑:您可以在Value
setter 中覆盖值,但我认为这在实践中看起来很奇怪:
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!?