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

C#中如何通过Type对象或类型字符串实现类型强制转换

错误原因

typeof()是C#的编译期运算符,仅支持传入编译阶段可确定的类型标识符(例如typeof(int)、typeof(string)),无法接收运行时才会赋值的Type类型变量,这是你代码报错的直接原因。

实现方案

运行时基于Type对象或类型字符串做类型转换,不需要也无法使用编译期的typeof()+强转语法,可按以下方式实现:

场景1:已知目标类型的Type对象

使用Convert.ChangeType完成转换,这是.NET原生提供的运行时类型转换API,支持所有实现了IConvertible接口的类型(包含所有基础值类型、string等常用类型):

int i = 10;
Type t = i.GetType(); // 也可以是任意运行时拿到的Type实例,比如typeof(string)
// 转换返回值为object类型,可根据实际业务做后续处理
object convertedResult = Convert.ChangeType(i, typeof(string));
string str = (string)convertedResult;

如果是自定义引用类型,且确认源对象和目标类型兼容,可以直接做类型判断后赋值:

object sourceInstance = new MyCustomType();
Type targetType = typeof(MyCustomType);
if (targetType.IsInstanceOfType(sourceInstance))
{
    MyCustomType typedInstance = (MyCustomType)sourceInstance;
}

场景2:已知目标类型的全名字符串

先通过反射解析字符串拿到对应的Type对象,再按上述转换逻辑处理即可:

int i = 10;
// 注意:当前程序集或核心库中的类型可直接传带命名空间的全名,外部程序集类型需要传入程序集限定名
string targetTypeFullName = "System.String";
Type targetType = Type.GetType(targetTypeFullName);
if (targetType != null)
{
    string str = (string)Convert.ChangeType(i, targetType);
}
注意事项
  • 所有运行时转换的结果在编译阶段都被识别为object类型,因为编译器无法提前预知运行时确定的目标类型,如果你需要编译期就确定的强类型返回值,说明场景不需要动态类型解析,直接使用常规强转语法即可。
  • Convert.ChangeType默认不会调用自定义类中定义的隐式/显式转换运算符,如果需要支持这类自定义转换逻辑,需要通过反射找到类中定义的op_Implicit/op_Explicit方法并手动调用。
  • 通过Type.GetType加载类型时,如果类型不在当前加载的程序集中,必须传入格式为"类型全名, 程序集名"的程序集限定名,否则方法会返回null导致转换失败。

内容的提问来源于stack exchange,提问作者Muhammad Faizan Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:24:25