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
相关产品推荐
相关产品推荐

