为什么 .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));
您需要使用 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 方法的实现花费的时间和精力要多得多。祝你好运
此致,安德鲁
我有一个 .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));
您需要使用 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 方法的实现花费的时间和精力要多得多。祝你好运 此致,安德鲁