如何创建返回泛型数据的IReadOnlyCollection<T>方法 支持int、long类型入参
泛型改造实现
我们可以通过添加泛型参数+通用类型转换的方式,实现同时支持int和long类型的需求,改造后的代码如下:
public static IReadOnlyCollection<T> FillData<T>(this string[] ids, IReadOnlyCollection<T> list) { var dataList = list?.ToList() ?? new List<T>(); Type convertedType = typeof(T); foreach (var id in ids) { // 通用类型转换逻辑,自动适配int/long类型 var value = (T)Convert.ChangeType(id, convertedType); dataList.Add(value); } return dataList.AsReadOnly(); }
可选限制:仅允许int/long类型
如果需要严格限制泛型只能传入int和long,避免其他不支持类型调用抛出异常,可以在方法开头增加类型校验逻辑:
public static IReadOnlyCollection<T> FillData<T>(this string[] ids, IReadOnlyCollection<T> list) { Type convertedType = typeof(T); // 严格限制仅支持int和long两种类型 if (convertedType != typeof(int) && convertedType != typeof(long)) { throw new NotSupportedException("当前方法仅支持int和long两种数值类型"); } var dataList = list?.ToList() ?? new List<T>(); foreach (var id in ids) { var value = (T)Convert.ChangeType(id, convertedType); dataList.Add(value); } return dataList.AsReadOnly(); }
使用示例
调用时只需要指定对应的泛型参数即可自动匹配返回类型:
- 生成int类型集合
string[] idArr = new string[] {"1", "2", "3"}; // 无已有集合的调用方式 IReadOnlyCollection<int> intList = idArr.FillData<int>(null); // 传入已有int集合合并 var existedIntList = new List<int>{4,5}.AsReadOnly(); IReadOnlyCollection<int> mergedIntList = idArr.FillData(existedIntList);
- 生成long类型集合
string[] idArr = new string[] {"100000000000", "200000000000"}; // 无已有集合的调用方式 IReadOnlyCollection<long> longList = idArr.FillData<long>(null); // 传入已有long集合合并 var existedLongList = new List<long>{300000000000}.AsReadOnly(); IReadOnlyCollection<long> mergedLongList = idArr.FillData(existedLongList);
补充说明
原始代码存在两处拼写错误已在改造时修复:
- 接口名
IReadonlyCollection修正为标准写法IReadOnlyCollection - 返回值变量
datalist修正为定义的dataList
内容的提问来源于stack exchange,提问作者Radost
相关产品推荐
相关产品推荐

