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

如何将对象转换为变量存储的类型以调用正确重载方法?

问题描述

我有一个类用于处理外部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:32:16