diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.cs index d877c72..329dd5d 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.cs @@ -358,15 +358,15 @@ namespace Spectre.Console.Tests.Unit.Cli // Then registrar.Registrations.ContainsKey(typeof(ICommand)).ShouldBeTrue(); - registrar.Registrations.ContainsKey(typeof(DogSettings)); registrar.Registrations[typeof(ICommand)].ShouldContain(typeof(DogCommand)); } [Fact] - public void Should_Register_Default_Command_Settings_When_Configuring_Application() + public void Can_Register_Default_Command_Settings_When_Configuring_Application() { // Given var registrar = new FakeTypeRegistrar(); + registrar.Register(typeof(DogSettings), typeof(DogSettings)); var app = new CommandApp(registrar); app.Configure(config => { @@ -380,7 +380,7 @@ namespace Spectre.Console.Tests.Unit.Cli }); // Then - registrar.Registrations.ContainsKey(typeof(DogSettings)); + registrar.Registrations.ContainsKey(typeof(DogSettings)).ShouldBeTrue(); registrar.Registrations[typeof(DogSettings)].Count.ShouldBe(1); registrar.Registrations[typeof(DogSettings)].ShouldContain(typeof(DogSettings)); } @@ -415,10 +415,12 @@ namespace Spectre.Console.Tests.Unit.Cli } [Fact] - public void Should_Register_Command_Settings_When_Configuring_Application() + public void Can_Register_Command_Settings_When_Configuring_Application() { // Given var registrar = new FakeTypeRegistrar(); + registrar.Register(typeof(DogSettings), typeof(DogSettings)); + registrar.Register(typeof(MammalSettings), typeof(MammalSettings)); var app = new CommandApp(registrar); app.Configure(config => { diff --git a/src/Spectre.Console/Cli/Internal/Binding/CommandPropertyBinder.cs b/src/Spectre.Console/Cli/Internal/Binding/CommandPropertyBinder.cs index 5b9a2e0..a7f4cbb 100644 --- a/src/Spectre.Console/Cli/Internal/Binding/CommandPropertyBinder.cs +++ b/src/Spectre.Console/Cli/Internal/Binding/CommandPropertyBinder.cs @@ -25,9 +25,21 @@ namespace Spectre.Console.Cli private static CommandSettings CreateSettings(ITypeResolver resolver, Type settingsType) { - if (resolver.Resolve(settingsType) is CommandSettings settings) + try { - return settings; + if (resolver.Resolve(settingsType) is CommandSettings settings) + { + return settings; + } + } + catch + { + // ignored + } + + if (Activator.CreateInstance(settingsType) is CommandSettings instance) + { + return instance; } throw CommandParseException.CouldNotCreateSettings(settingsType); diff --git a/src/Spectre.Console/Cli/Internal/Extensions/TypeRegistrarExtensions.cs b/src/Spectre.Console/Cli/Internal/Extensions/TypeRegistrarExtensions.cs index 3b2a00a..14f713d 100644 --- a/src/Spectre.Console/Cli/Internal/Extensions/TypeRegistrarExtensions.cs +++ b/src/Spectre.Console/Cli/Internal/Extensions/TypeRegistrarExtensions.cs @@ -31,11 +31,6 @@ namespace Spectre.Console.Cli registrar?.Register(command.CommandType, command.CommandType); } - if (!command.SettingsType.IsAbstract) - { - registrar?.Register(command.SettingsType, command.SettingsType); - } - foreach (var parameter in command.Parameters) { var pairDeconstructor = parameter?.PairDeconstructor?.Type;