diff --git a/Source/FunicularSwitch/FunicularSwitch.csproj b/Source/FunicularSwitch/FunicularSwitch.csproj index 7af2840..7858bd3 100644 --- a/Source/FunicularSwitch/FunicularSwitch.csproj +++ b/Source/FunicularSwitch/FunicularSwitch.csproj @@ -14,7 +14,7 @@ 6 - 4.0 + 4.1 $(MajorVersion).0.0 diff --git a/Source/FunicularSwitch/Option.cs b/Source/FunicularSwitch/Option.cs index ea4813d..78cfdfc 100644 --- a/Source/FunicularSwitch/Option.cs +++ b/Source/FunicularSwitch/Option.cs @@ -128,9 +128,12 @@ public T GetValueOrThrow(string? errorMessage = null) => : throw new InvalidOperationException(errorMessage ?? "Cannot access value of none option"); public Option Convert() => - Match(s => Option.Some((TOther)(object)s!), Option.None); + Match(s => Option.Some((TOther)(object)s!), Option.None); - public override string ToString() => Match(v => v?.ToString() ?? "", () => $"None {typeof(T).BeautifulName()}"); + public Option As() where TTarget : class => + Bind(item => (item as TTarget).ToOption()); + + public override string ToString() => Match(v => v?.ToString() ?? "", () => $"None {typeof(T).BeautifulName()}"); public bool Equals(Option other) => _isSome == other._isSome && EqualityComparer.Default.Equals(_value, other._value); diff --git a/Source/Tests/FunicularSwitch.Test/OptionSpecs.cs b/Source/Tests/FunicularSwitch.Test/OptionSpecs.cs index ff69b50..6d27b87 100644 --- a/Source/Tests/FunicularSwitch.Test/OptionSpecs.cs +++ b/Source/Tests/FunicularSwitch.Test/OptionSpecs.cs @@ -595,6 +595,20 @@ public void As_DoesNotMatch_None() asList.Should().BeNone(); } + [TestMethod] + public void AsConvertOptionValue() + { + var value = new MyDerived(); + var myBaseOption = Some(value); + myBaseOption.As().Should().BeSome().Which.Should().Be(value); + myBaseOption.As().Should().BeSome().Which.Should().Be(value); + myBaseOption.As().Should().BeNone(); + } + + class MyBase; + class MyDerived : MyBase; + class AnotherClass; + [TestMethod] public async Task Match_TaskOptionT_FuncTTout_FuncTOut_Some_Matched() {