如何将对象转换为变量存储的类型以调用正确重载方法?
问题描述
我有一个类用于处理外部API返回的对象,会根据对象类型(如Body2、Face2)通过重载方法提取信息:
static class InfoExtractor { public static InfoProperty Extract(Body2 body) { //... } public static InfoProperty Extract(Face2 face) { //... } }
由于该API特性,无法直接获取这些对象的类型(当前均为object类型),因此将其类型存储在包装类中:
class Body2Wrapper : ApiObjectWrapper { object objectRef; Type objectType = typeof(Body2); }
(ApiObjectWrapper是一个接口,可将不同实现放入同一列表)
我拥有一个ApiObjectWrapper列表,遍历它时希望根据ApiObjectWrapper.objectType调用InfoExtractor.Extract()的正确重载,理想写法如下:
foreach (ApiObjectWrapper apiObject in apiObjects) { InfoProperty info = InfoExtractor.Extract((apiObject.objectType)apiObject.objectRef); //... }
此写法无法生效,我想知道如何将对象转换为变量中存储的类型?
注:我无法修改底层类型,不想通过字符串存储类型并使用switch进行显式转换。
解决方案
方案一:通过反射动态调用重载方法
利用反射获取匹配目标类型的Extract方法,再传入实例执行调用,代码如下:
foreach (ApiObjectWrapper apiObject in apiObjects) { // 获取对应参数类型的Extract静态方法 var extractMethod = typeof(InfoExtractor).GetMethod( nameof(InfoExtractor.Extract), new[] { apiObject.objectType } ); if (extractMethod == null) { // 处理无对应重载的场景,比如抛出异常或返回默认值 throw new InvalidOperationException($"未找到类型{apiObject.objectType.Name}对应的Extract方法"); } // 调用方法并转换返回值 InfoProperty info = (InfoProperty)extractMethod.Invoke(null, new[] { apiObject.objectRef }); // 后续业务逻辑... }
方案二:扩展ApiObjectWrapper接口实现类型专属调用
给ApiObjectWrapper接口添加抽象方法,让每个包装类自行实现类型转换和方法调用,避免反射开销:
// 扩展接口 interface ApiObjectWrapper { InfoProperty ExtractInfo(); } // Body2Wrapper实现 class Body2Wrapper : ApiObjectWrapper { public object objectRef; public Type objectType = typeof(Body2); public InfoProperty ExtractInfo() { return InfoExtractor.Extract((Body2)objectRef); } } // Face2Wrapper同理 class Face2Wrapper : ApiObjectWrapper { public object objectRef; public Type objectType = typeof(Face2); public InfoProperty ExtractInfo() { return InfoExtractor.Extract((Face2)objectRef); } }
遍历列表时直接调用接口方法即可:
foreach (ApiObjectWrapper apiObject in apiObjects) { InfoProperty info = apiObject.ExtractInfo(); // 后续业务逻辑... }
内容的提问来源于stack exchange,提问作者Justin8051
相关产品推荐
相关产品推荐

