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
相关产品推荐
相关产品推荐

