C#按字典指定类型转换为IList取Count编译报错如何解决
问题原因
你写的((mapAllGet[useRecType].CastAsType)dataList)语法本身不符合C#规范:强制类型转换要求转换目标类型必须是编译期就可以确定的常量类型,而CastAsType是运行时才会拿到的Type类型变量,编译阶段无法识别该写法,因此直接触发编译器报错。
最优解决方案
所有泛型IList<T>默认都实现了非泛型的ICollection接口,该接口自带Count属性,完全可以满足你获取集合元素数量的需求,不需要做运行时动态类型转换。
你只需要先引入对应的命名空间:
using System.Collections;
再修改报错的那一行代码即可:
else { return ((ICollection)dataList).Count; }
该方案不需要反射、没有额外性能开销,也不需要修改你现有GetValuesStruct结构体和字典的定义,可以直接适配你现有的所有业务逻辑。
可选优化方案
如果你后续不需要用到CastAsType做其他逻辑,完全可以简化结构体定义,直接存储返回计数的委托,彻底避免类型转换问题:
struct GetValuesStruct { public Func<int> GetCountMethod {get;set;} } // 字典初始化对应修改为 Dictionary<PayRecType, GetValuesStruct> mapAllGet = new Dictionary<PayRecType, GetValuesStruct>() { { PayRecType.AA, new GetValuesStruct() { GetCountMethod = () => GetAARecords()?.Count ?? -1 } }, // 其余枚举值按相同格式修改即可 }; // 方法逻辑可以直接简化为 private int GetDataPartCount(PayRecType useRecType) { return mapAllGet[useRecType].GetCountMethod(); }
特殊场景适配:如果你使用的自定义集合类型没有实现
ICollection接口,可以用动态类型的写法绕开编译期类型检查,但该方法有运行时报错风险,需要你自行保证返回的对象一定有Count属性:return ((dynamic)dataList).Count;
内容的提问来源于stack exchange,提问作者Arkaine80
相关产品推荐
相关产品推荐

