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

C# 泛型类中如何根据泛型类型不同实现差异化方法逻辑

方案1:重写自定义类型的ToString()方法(无侵入现有Matrix代码,成本最低)

C#所有类型都继承自object基类,默认自带虚方法ToString(),int、string、double等基础类型已经内置了符合预期的ToString()实现,你只需要在自定义类中重写该方法即可适配Display逻辑,不需要修改现有Matrix类的任何代码。

修改后的Person类示例:

class Person
{
    public string Name;
    public int Age;

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    // 重写ToString方法,返回你期望输出的内容
    public override string ToString()
    {
        return Name;
    }
}

直接调用原有people.Display()即可输出每个Person的Name属性,原有基础类型的矩阵输出逻辑完全不受影响。

方案2:给Display方法新增格式化委托参数(灵活度最高,不需要修改自定义类)

如果你不想修改自定义类的代码,可以给Display方法增加一个可选的格式化委托参数,调用时可以按需指定任意类型的输出规则,原有逻辑也能兼容:

修改后的Matrix.Display方法代码:

public void Display(Func<T, string> formatter = null)
{
    StringBuilder sb = new StringBuilder();
    try
    {
        // 没有传自定义格式化规则时,默认用ToString输出
        formatter ??= obj => obj?.ToString() ?? string.Empty;
        for (int i = 0; i < Rows; i++)
        {
            sb.AppendLine();
            for (int j = 0; j < Cols; j++)
            {
                sb.Append(formatter(_elements[i, j]) + "\t");
            }
        }
        Console.WriteLine(sb.ToString());
    }
    catch
    {
        Console.WriteLine("An error occurred.");
    }
}

调用Person矩阵时可以直接指定输出规则:

people.Display(p => p.Name);

基础类型矩阵还是可以直接调用无参的Display(),输出逻辑和之前完全一致。

你之前考虑的接口约束方案不是最优解,会额外增加自定义类型的实现成本,内置的ToString已经能覆盖所有类型的默认输出需求,不需要额外做接口约束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:57:03