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

