运行时已知类型名称时,如何实现对象的强制转换?
运行时根据类名字符串实现类型转换的解决方案
刚好碰到过类似的场景,核心问题在于咱们只有运行时才能拿到的类名字符串,没法直接用编译时的强转语法来处理。这里给你两种可行的方案:
方案一:利用反射调用泛型反序列化方法
这种方式更贴合你现在的代码结构,类型转换也更可靠:
首先,把重复的反序列化逻辑抽成一个泛型辅助方法:
public static class SerializationHelper { public static T Deserialize<T>(byte[] compressedData) { var decompressed = CompressionUtils.Decompress(compressedData); using var ms = new MemoryStream(decompressed); var bf = new BinaryFormatter(); return (T)bf.Deserialize(ms); } }
然后在业务代码里,通过反射调用这个泛型方法,传入运行时获取的类型:
string className = "Model.Menu"; // 注意:如果类在其他程序集中,要加上程序集名称,比如"Model.Menu, YourAssemblyName" Type targetType = Type.GetType(className); // 获取泛型方法的定义 MethodInfo deserializeMethod = typeof(SerializationHelper).GetMethod("Deserialize", BindingFlags.Public | BindingFlags.Static); // 构造对应类型的泛型方法实例 MethodInfo genericMethod = deserializeMethod.MakeGenericMethod(targetType); // 调用方法得到转换后的对象 object mappedCollection = genericMethod.Invoke(null, new object[] { requestModel.data });
方案二:直接使用Convert.ChangeType(有局限性)
如果你的目标类型实现了IConvertible接口,可以用这种简化方式,但不是所有自定义类都满足这个条件,适用性不如方案一:
string className = "Model.Menu"; Type targetType = Type.GetType(className); var decompress = CompressionUtils.Decompress(requestModel.data); var bf = new BinaryFormatter(); var obj = bf.Deserialize(new MemoryStream(decompress)); // 转换为目标类型 var mappedCollection = Convert.ChangeType(obj, targetType);
额外提醒
还要提一句:BinaryFormatter已经被.NET官方标记为过时(Obsolete),它存在严重的安全漏洞,不建议在新代码中使用。如果可以的话,建议换成更安全的序列化库,比如System.Text.Json、Newtonsoft.Json或者Protobuf。
内容的提问来源于stack exchange,提问作者Vidhyut Kediya
相关产品推荐
相关产品推荐

