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

如何实现将SDKList转换为支持多类型的C#泛型List<T>?

实现SDKList到泛型List的转换方法

核心思路

要实现通用的泛型转换方法,核心是验证类型匹配+逐个安全转换,同时处理异常场景,避免类型不兼容导致的运行时错误。

完整代码实现

public static List<T> sdkListToCSharpList<T>(SDKList sdkList)
{
    // 空值校验
    if (sdkList == null)
        throw new ArgumentNullException(nameof(sdkList));

    // 验证SDKList的存储类型与泛型参数T兼容
    if (!typeof(T).IsAssignableFrom(sdkList.Type))
        throw new InvalidOperationException($"SDKList存储的类型{sdkList.Type.Name}无法转换为目标类型{typeof(T).Name}");

    var result = new List<T>();

    // 遍历SDKList的Item集合(根据SDKList实际遍历方式调整,以下是两种常见情况)
    // 情况1:SDKList实现了IEnumerable接口,可直接foreach遍历
    foreach (var item in sdkList)
    {
        // 安全类型转换
        if (item is T typedItem)
            result.Add(typedItem);
        else
            throw new InvalidCastException($"Item类型{item.GetType().Name}与目标类型{typeof(T).Name}不兼容");
    }

    // 情况2:SDKList未实现IEnumerable,通过索引+Count属性遍历(需替换为SDK实际提供的API)
    // for (int i = 0; i < sdkList.Count; i++)
    // {
    //     var item = sdkList.GetItem(i); // 假设SDK提供GetItem方法获取指定索引元素
    //     if (item is T typedItem)
    //         result.Add(typedItem);
    //     else
    //         throw new InvalidCastException($"索引{i}处的Item类型{item.GetType().Name}与目标类型{typeof(T).Name}不兼容");
    // }

    return result;
}

关键细节说明

  • 泛型参数约束优化:如果所有SDK元素类型(SDKElement、SDKSurface等)都继承自同一基类(比如SDKBase),可以给泛型参数添加约束,缩小合法输入范围,提升方法安全性:
    public static List<T> sdkListToCSharpList<T>(SDKList sdkList) where T : SDKBase
    
  • 类型匹配灵活性:用typeof(T).IsAssignableFrom(sdkList.Type)替代直接类型相等,允许SDKList存储T的子类类型,适配更多场景。
  • 异常清晰化:添加多环节校验,确保调用方能快速定位空值、类型不匹配、转换失败等问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:53:21