如何在C#中创建泛型列表迭代方法?实现重复代码复用
用泛型+委托/接口解决XML节点列表的重复处理问题
这问题我之前做XML解析的时候也踩过坑!每次不同类型都写一遍循环和查询,代码冗余到爆炸。其实用泛型+转换逻辑注入就能把重复代码彻底抽出来,下面给你两个实用的实现方案:
方案一:泛型方法+转换委托(最灵活)
直接把变化的部分——「节点名称」和「XElement转目标对象的逻辑」做成参数传入泛型方法,固定的循环和查询逻辑放在方法里复用:
public List<T> ParseXmlList<T>(XElement rootElement, string parentNodeName, Func<XElement, T> elementConverter) { // 固定的节点查询逻辑 var targetNodes = rootElement.Descendants().Where(c => c.Name.LocalName == parentNodeName); // 通用的循环转换逻辑 List<T> resultList = new List<T>(); foreach (var node in targetNodes) { T item = elementConverter(node); resultList.Add(item); } return resultList; }
调用示例
比如原来处理类型A的逻辑,现在可以这样调用:
// 处理类型A的列表 var individualList = ParseXmlList<Data>(e, parentNodeForPerson, node => { // 这里写Data类从XElement转换的逻辑,比如: return new Data { Id = node.Element("Id")?.Value, Name = node.Element("Name")?.Value // 其他属性映射 }; }); // 处理另一个类型B的列表,只需要改类型和转换逻辑 var orderList = ParseXmlList<Order>(e, "Order", node => { return new Order { OrderNumber = node.Element("OrderNo")?.Value, Amount = decimal.Parse(node.Element("Amount")?.Value ?? "0") }; });
方案二:定义转换接口(适合大量类型需要解析的场景)
如果你的很多类都需要从XML节点转换,可以定义一个统一的接口,让这些类实现转换逻辑,然后泛型方法加上接口约束:
// 定义转换接口 public interface IXmlParsable { void FromXElement(XElement element); } // 让你的Data类实现接口 public class Data : IXmlParsable { public string Id { get; set; } public string Name { get; set; } public void FromXElement(XElement element) { Id = element.Element("Id")?.Value; Name = element.Element("Name")?.Value; } } // 泛型方法(带接口约束) public List<T> ParseXmlList<T>(XElement rootElement, string parentNodeName) where T : IXmlParsable, new() { var targetNodes = rootElement.Descendants().Where(c => c.Name.LocalName == parentNodeName); List<T> resultList = new List<T>(); foreach (var node in targetNodes) { T item = new T(); item.FromXElement(node); resultList.Add(item); } return resultList; }
调用示例
这样调用起来更简洁,不需要每次写转换委托:
var individualList = ParseXmlList<Data>(e, parentNodeForPerson); var orderList = ParseXmlList<Order>(e, "Order"); // 假设Order也实现了IXmlParsable
为什么这两个方案能解决你的问题?
- 泛型
<T>让方法可以适配任意类类型,不用再根据listType写if-else分支 - 转换委托/接口把「不同类的XML映射逻辑」从通用循环中分离出来,只需要关注每个类独有的属性映射
- 固定的节点查询、列表初始化和循环逻辑被抽成通用方法,彻底消除重复代码
内容的提问来源于stack exchange,提问作者Abdul
相关产品推荐
相关产品推荐

