Почему конфигурация параметров .NET Core не работает с параметром универсального типа? - PullRequest
3 голосов
/ 20 мая 2019

У меня есть проект .NET Core WebApi.Чтобы легко прочитать настройки приложения, я настраиваю параметры, которые будут вводиться с помощью DI.Это отлично работает.Однако, если я пытаюсь вызвать Configure<>() с параметром универсального типа, я получаю ошибку.

Аргумент 2: невозможно преобразовать из «Microsoft.Extensions.Configuration.IConfigurationSection» в «System.Action»

Перегрузки метода, кроме Configure<T>(Action<T> configureOptions), по-видимому, больше не доступны.

Почему вызов не работает с параметрами универсального типа?

Startup.cs

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        // services.AddMvc() etc...

        services.AddOptions();

        // Works fine
        services.Configure<MyOption>(Configuration.GetSection(nameof(MyOption)));
    }

    private void AddOption<T>(IServiceCollection services)
    {
        // Wont work
        services.Configure<T>(Configuration.GetSection(nameof(T)));
        services.Configure<T>(Configuration.GetSection(""));
    }
}

MyOption.cs

public class MyOption
{
    public bool MyProp { get; set; }
}

appsettings.json

{
    "MyOption": {
        "MyProp": true
    }
}

Ответы [ 4 ]

3 голосов
/ 20 мая 2019

Вам нужно изменить свою функцию AddOption следующим образом:

private void AddOption<T>(IServiceCollection services) where T : class 
{
    services.Configure<T>(Configuration.GetSection(typeof(T).Name));
}

вы забыли о where T : class в объявлении метода

И после того, как вы можете использовать этот метод, как здесь:

AddOption<MyOption>(services);
0 голосов
/ 27 мая 2019

Если вы хотите стать хорошим программистом, научитесь читать ошибки и рыться в документациях и реализациях библиотек, а не писать здесь по любой причине. @ igor-cova уже дал правильный ответ. В следующий раз будьте осторожны, потому что на написание этого вопроса ушло гораздо больше времени и усилий, чем вы бы сами рассмотрели в реализации метода Configure. Удачи С уважением, Андрей

enter image description here

0 голосов
/ 20 мая 2019

Вам необходимо воспользоваться услугами. Настройте, как показано ниже:

services.Configure<MyOption>(setting =>
{  
    Configuration.GetSection("MyOption").Bind(setting);  
});  
0 голосов
/ 20 мая 2019

Очевидно, nameof(T) просто вернет строку "T".

Вам нужно использовать typeof(T).Name вместо:

services.Configure<T>(Configuration.GetSection(typeof(T).Name));

См. Документация

...