如何实现将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
相关产品推荐
相关产品推荐

