[英]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));
见文档
您需要使用services.Configure如下:
services.Configure<MyOption>(setting =>
{
Configuration.GetSection("MyOption").Bind(setting);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.