扩展方法传入Type类型转换对象时编译报错的解决方法
问题解决:动态类型转换的编译错误修复
为什么原代码报错
你写的(type)o是非法语法——type是Type类的实例,代表运行时的类型信息,但强制转换(类型标识符)对象要求类型标识符必须是编译时就能确定的具体类型(比如int、string),所以编译器无法识别这种写法。
方案1:用泛型实现类型安全的版本
这是更推荐的方案,利用泛型让编译器在编译时确定类型,既解决转换问题,还能获得类型安全检查:
using System.Globalization; public static void AddCellProperties<T>(this ColumnInfo _columnInfo) { _columnInfo.SetCellUsing((c, o) => { if (o == null) c.SetCellValue("NULL"); else c.SetCellValue((T)o); }) .SetPropertyUsing(a => a as string == "NULL" ? null : (T)Convert.ChangeType(a, typeof(T), CultureInfo.InvariantCulture)); }
调用时直接指定类型即可:
columnInfo.AddCellProperties<int>(); columnInfo.AddCellProperties<string>();
方案2:保留Type参数的动态版本
如果必须在运行时动态指定类型(比如只能通过反射获取Type实例),可以用Convert.ChangeType完成转换,因为它会返回对应类型的对象,只要SetCellValue有接受object的重载就能正常工作:
using System.Globalization; public static void AddCellProperties(this ColumnInfo _columnInfo, Type type) { _columnInfo.SetCellUsing((c, o) => { if (o == null) c.SetCellValue("NULL"); else c.SetCellValue(Convert.ChangeType(o, type, CultureInfo.InvariantCulture)); }) .SetPropertyUsing(a => a as string == "NULL" ? null : Convert.ChangeType(a, type, CultureInfo.InvariantCulture)); }
两种方案对比
- 泛型版本:编译时类型检查,避免运行时转换错误,代码更简洁安全。
- Type参数版本:支持运行时动态类型,适合无法提前确定类型的场景,但缺少编译时检查。
内容的提问来源于stack exchange,提问作者kumar425
相关产品推荐
相关产品推荐

