如何创建泛型函数getById<T>,实现类的List<T>成员按ID查找
优化带Id属性类的通用查找方法
问题场景
当多个自定义类都包含int Id属性,且需要在持有这些类集合的容器类中按Id查找元素时,会出现大量仅类型不同的重复查找代码,示例如下:
public class ClassA { public int Id { get; set; } } public class ClassB { public int Id { get; set; } } public class MainClass { public List<ClassA> As = new List<ClassA>(); public List<ClassB> Bs = new List<ClassB>(); public ClassA GetClassAById(int id) { foreach (var classA in As) { if (classA.Id == id) { return classA; } } return null; } public ClassB GetClassBById(int id) { foreach (var classB in Bs) { if (classB.Id == id) { return classB; } } return null; } }
优化方案
通过定义统一接口约束+泛型方法的方式,可以彻底消除重复代码,实现通用的按Id查找逻辑:
1. 定义带Id属性的统一接口
先创建一个接口,约束所有需要按Id查找的类必须实现Id属性:
public interface IHasId { int Id { get; } }
2. 改造自定义类实现接口
让所有带Id的类实现上述接口:
public class ClassA : IHasId { public int Id { get; set; } } public class ClassB : IHasId { public int Id { get; set; } }
3. 实现通用泛型查找方法
在MainClass中添加一个泛型方法,只要传入的集合元素实现了IHasId接口,就能复用查找逻辑:
public class MainClass { public List<ClassA> As = new List<ClassA>(); public List<ClassB> Bs = new List<ClassB>(); // 通用按Id查找方法 public T GetElementById<T>(List<T> collection, int id) where T : IHasId { // 基础foreach实现 foreach (var item in collection) { if (item.Id == id) { return item; } } return default; // 或用LINQ简化(需引用System.Linq) // return collection.FirstOrDefault(item => item.Id == id); } // 可选:保留原有方法签名,内部调用通用方法(兼容旧代码) public ClassA GetClassAById(int id) => GetElementById(As, id); public ClassB GetClassBById(int id) => GetElementById(Bs, id); }
方案优势
- 消除重复代码:所有实现
IHasId的类都能复用同一个查找逻辑,后续新增带Id的类,只需实现接口即可,无需再写新的查找方法。 - 类型安全:通过泛型约束确保传入的类型一定包含
Id属性,编译期就能发现错误。 - 性能优异:相比反射实现,接口约束的方式不会带来额外性能开销。
内容的提问来源于stack exchange,提问作者Tsaras
相关产品推荐
相关产品推荐

