You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC中Dapper无法将List<object>转为List<Model>的问题

问题根源

你遇到的报错核心是泛型不变性限制:List<object>和List<GetTemplates>是完全独立的类型,无法直接强制转换。你的通用方法返回的是装箱为object的List<object>,而非实际的List<GetTemplates>,所以强转必然失败。

解决方案

方案1:重构通用方法为泛型(最优解)

直接把通用方法改成泛型实现,从根源上避免类型装箱问题,让方法直接返回目标类型列表:

public async Task<List<T>> QueryAsync<T>(string sql, object parameters = null)
{
    using (var connection = new SqlConnection(_connectionString))
    {
        await connection.OpenAsync();
        var queryResult = await connection.QueryAsync<T>(sql, parameters);
        return queryResult.ToList();
    }
}

调用时直接指定泛型参数,无需强转:

List<GetTemplates> templates = await yourRepo.QueryAsync<GetTemplates>("SELECT ...", queryParams);

方案2:无法修改通用方法时,手动转换元素

如果因架构限制不能修改通用方法,需要将返回的List<object>中的元素逐个转换为目标类型:

var rawResult = await yourGenericQueryMethod();
// 基础转换(需确保列表内元素都是GetTemplates类型)
List<GetTemplates> templates = ((List<object>)rawResult).Cast<GetTemplates>().ToList();

// 安全转换(处理可能的类型不匹配)
List<GetTemplates> safeTemplates = ((List<object>)rawResult)
    .Where(item => item is GetTemplates)
    .Select(item => (GetTemplates)item)
    .ToList();

注意:这种方式仅适用于通用方法内部实际查询出了GetTemplates实例(只是被装箱到object列表)的情况。如果通用方法是用QueryAsync<object>执行的,返回的会是动态对象(如ExpandoObject),此时需要手动映射属性,或优先采用方案1。

关键原理

List<T>是不变泛型类型,哪怕GetTemplates是object的子类,List<object>也不能被当作List<GetTemplates>使用——CLR无法保证列表内的所有元素都是GetTemplates类型,直接强转会破坏类型安全。

内容的提问来源于stack exchange,提问作者Ibrahim shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:50:27