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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:23:42