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

C#如何重载支持多类型参数的方法并尽可能减少代码重复

实现方案

你不需要做运行时类型检查,也不需要写重复的重载逻辑,只需要把公共逻辑抽成私有泛型核心方法,对外保留两个你需要的重载签名即可。
SqlDataReader自带的索引器本身就支持接收int和string类型的参数,泛型方法在编译期就会自动匹配对应的索引器重载,全程没有额外类型判断开销。

首先写两个对外暴露的公开重载,每个重载只有一行调用逻辑,没有重复代码:

// 支持按列名查询的重载
public List<List<object>> Query(string query, List<string> relevantColumns)
{
    return QueryCore(query, relevantColumns);
}

// 支持按列序号查询的重载
public List<List<object>> Query(string query, List<int> relevantColumns)
{
    return QueryCore(query, relevantColumns);
}

所有数据库连接、命令执行、结果遍历的公共逻辑,全部收敛到私有泛型核心方法中:

private List<List<object>> QueryCore<T>(string query, List<T> relevantColumns)
{
    var rows = new List<List<object>>();
    using (SqlConnection connection = new SqlConnection(this.ConnectionString))
    {
        var command = new SqlCommand(query, connection);
        connection.Open();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                List<object> row = relevantColumns.Select(col => reader[col]).ToList();
                rows.Add(row);
            }
        }
    }
    return rows;
}

方案优势

  • 对外调用体验和写两个完全独立的重载没有区别,调用方可以直接传入List<string>或List<int>类型的列参数,不需要做额外转换
  • 没有任何运行时类型检查逻辑,泛型调用在编译期就完成绑定,没有额外性能损耗
  • 核心逻辑仅维护一份,后续修改查询逻辑只需要改核心方法一处,不会出现两个重载逻辑不一致的问题
  • 核心泛型方法为私有,不会对外暴露多余的API签名,外部调用方无法传入int/string之外的类型作为列参数;如果有人通过反射强行传入其他类型,会在调用reader[col]时直接由运行时抛出索引器不匹配的错误,不需要额外写校验逻辑。

注:原示例代码中command.Connection.Open()可以直接简化为connection.Open(),两者指向同一个连接实例,没有必要通过command对象间接访问,上述核心方法中已经做了这个简化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:03:25