为什么 .NET Core 选项的配置不适用于泛型类型参数?

Why does the configuration of .NET Core options not work with a generic type parameter?

我有一个 .NET Core WebApi 项目。为了以一种简单的方式阅读应用程序设置,我将选项配置为使用 DI 注入。这很好用。但是,如果我尝试使用泛型类型参数调用 Configure<>(),则会出现错误。

Argument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to '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
    }
}

显然,nameof(T) 只会 return 字符串 "T"。

您需要改用typeof(T).Name

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

Documentation

您需要使用 services.Configure 如下:

services.Configure<MyOption>(setting =>
{  
    Configuration.GetSection("MyOption").Bind(setting);  
});  

您需要像这样更改函数 AddOption

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

你忘记了方法声明中的where T : class

然后你可以像那里那样使用这个方法:

AddOption<MyOption>(services);

如果你想成为一名优秀的程序员,那就学会阅读错误并翻阅库的文档和实现,而不是在这里无所不写。 @igor-cova 已经给你正确答案了。下次要小心,因为写这个问题比您自己研究 Configure 方法的实现花费的时间和精力要多得多。祝你好运 此致,安德鲁