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

泛型函数传递类参数:如何创建DataNamesMapper泛型实例?

这个需求完全可行!你遇到的问题其实是泛型语法的小误区,咱们一步步来解决:

错误原因分析

你写的 DataNamesMapper<typeof(T)> 是语法错误——typeof(T) 是用来获取类型的Type对象的表达式,但泛型类型参数需要的是具体的类型名称(比如Person),不是一个Type实例。这就像你不能写 List<typeof(string)> 一样,编译器根本认不出这种写法。

修正方案

直接用泛型方法的类型参数 T 作为 DataNamesMapper 的泛型参数即可,同时别忘了给泛型方法加上和DataNamesMapper一致的约束(因为DataNamesMapper<TEntity>要求TEntity必须是引用类型且有无参构造函数)。

完整修正代码

// 给泛型方法加上匹配的约束:class, new()
public List<T> ReadDataTable<T>() where T : class, new()
{
    List<T> parsedObjects = new List<T>();
    // 正确写法:直接用T作为DataNamesMapper的泛型参数
    DataNamesMapper<T> mapper = new DataNamesMapper<T>();
    
    // 后续的查询、映射逻辑示例:
    // 假设你已经获取到了目标DataTable
    // DataTable dataTable = FetchDataFromMySQL();
    // foreach (DataRow row in dataTable.Rows)
    // {
    //     // 调用DataNamesMapper的映射方法把行转成T对象
    //     T entity = mapper.MapRowToEntity(row);
    //     parsedObjects.Add(entity);
    // }
    
    return parsedObjects;
}

为什么这样能行?

当你调用 ReadDataTable<Person>() 时,编译器会自动把方法里的T替换成Person,此时DataNamesMapper<T>就等价于你手动写的DataNamesMapper<Person>,和你测试的非泛型版本完全一致,完美满足你想要的List<Person>、List<Car>等不同类型的返回需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:12:56