泛型函数传递类参数:如何创建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
相关产品推荐
相关产品推荐

