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

扩展方法传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:10:26