namespace Umbraco.Cms.Core; /// /// Represents a value that can be assigned a value. /// /// The type of the value public class Settable { private T? _value; /// /// Gets a value indicating whether a value has been assigned to this instance. /// public bool HasValue { get; private set; } /// /// Gets the value assigned to this instance. /// /// An exception is thrown if the HasValue property is false. /// No value has been assigned to this instance. public T? Value { get { if (HasValue == false) { throw new InvalidOperationException("The HasValue property is false."); } return _value; } } /// /// Assigns a value to this instance. /// /// The value. public void Set(T? value) { if (value is not null) { HasValue = true; } _value = value; } /// /// Assigns a value to this instance by copying the value /// of another instance, if the other instance has a value. /// /// The other instance. public void Set(Settable other) { // set only if has value else don't change anything if (other.HasValue) { Set(other.Value); } } /// /// Clears the value. /// public void Clear() { HasValue = false; _value = default; } /// /// Gets the value assigned to this instance, if a value has been assigned, /// otherwise the default value of . /// /// /// The value assigned to this instance, if a value has been assigned, /// else the default value of . /// public T? ValueOrDefault() => HasValue ? _value : default; /// /// Gets the value assigned to this instance, if a value has been assigned, /// otherwise a specified default value. /// /// The default value. /// /// The value assigned to this instance, if a value has been assigned, /// else . /// public T? ValueOrDefault(T defaultValue) => HasValue ? _value : defaultValue; /// public override string? ToString() => HasValue ? _value?.ToString() : "void"; }