.NET 6配置绑定dynamic对象返回null的问题排查
.NET 6配置绑定返回null的问题排查
问题场景
appsettings.json配置内容:
{ "QueryConfigList": [ { "TableName": "Live", "QueryText": "SELECT * FROM Live", "AdditionalInfo": "Users only", "ObjectClass": { "TagName": "string", "Value1": "float" } }, { "TableName": "Orders", "QueryText": "SELECT * FROM Orders", "AdditionalInfo": "Completed orders", "ObjectClass": { "TagName": "string", "Value2": "string" } } ] }
对应的C#类定义:
public class QueryConfig { public string? TableName { get; set; } public string? QueryText { get; set; } public string? AdditionalInfo { get; set; } public dynamic? ObjectClass { get; set; } } public class QueryConfigList { public ICollection<QueryConfig>? QueryConfig { get; set; } }
在Startup.cs中执行绑定代码后返回null:
var queryConfigList = builder.Configuration.GetSection("QueryConfigList").Get<List<QueryConfig>>();
问题原因
核心问题在于**dynamic类型无法被.NET配置绑定系统正确反序列化**。配置绑定依赖明确的类型元数据映射配置节点,而dynamic没有固定的类型结构,绑定器无法确定如何将JSON对象转换为dynamic实例,最终导致整个绑定失败返回null。
你定义的QueryConfigList类并未实际使用,但这不是返回null的直接原因。
解决方法
将QueryConfig类中的dynamic? ObjectClass替换为Dictionary<string, object>? ObjectClass(或ExpandoObject? ObjectClass),让绑定器可以将JSON键值对映射为明确的结构:
修改后的类定义:
public class QueryConfig { public string? TableName { get; set; } public string? QueryText { get; set; } public string? AdditionalInfo { get; set; } public Dictionary<string, object>? ObjectClass { get; set; } }
重新执行绑定代码后,就能正确获取QueryConfigList中的配置项。如果需要更灵活的动态访问,也可以使用ExpandoObject,用法与字典类似,但支持通过属性语法访问键值。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

