繁体   English   中英

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

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

我有一个.NET Core WebApi项目。 要以简单的方式阅读appsettings,我配置要注入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
    }
}

您需要更改功能AddOption ,如下所示:

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

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

在你可以使用这种方法之后:

AddOption<MyOption>(services);

显然, nameof(T)只返回字符串“T”。

你需要使用typeof(T).Name代替:

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

文档

如果你想成为一名优秀的程序员,那么学会阅读错误并通过图书馆的文档和实现进行翻找,而不是在这里写出任何理由。 @ igor-cova已经给你正确答案了。 下一次,要小心,因为写这个问题需要花费更多的时间和精力,而不是你自己会考虑Configure方法的实现。 祝你好运,安德鲁

在此输入图像描述

您需要使用services.Configure如下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM