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

Unity泛型协程中通过System.Action返回泛型值的实现方案

Unity协程泛型Action回调类型转换问题解决

你遇到的报错根源是:System.Action<T> 和 System.Action<Texture2D> 属于不同的泛型实例,即便运行时确认T是Texture2D,编译器也不允许直接强转。以下是两种实用的解决方式:

方法一:包装回调做类型安全转换

在判断T为Texture2D后,将原Action<T>包装成目标类型的回调,再传递给专用方法:

public IEnumerator CoHttpGET<T>(string uri, System.Action<T> callback)
{
    if (typeof(T) == typeof(Texture2D))
    {
        // 包装回调:将Texture2D转换为T类型后调用原回调
        System.Action<Texture2D> textureCallback = (texture) =>
        {
            callback?.Invoke((T)(object)texture);
        };
        yield return WeatherTracker.instance.StartCoroutine(CoHttpGET_Texture(uri, textureCallback));
    }
    else
    {
        // 其他类型的处理逻辑
        ...
    }
}

这里(T)(object)texture是绕开编译检查的技巧——因为已经通过typeof(T)确认类型匹配,运行时不会出现转换异常。

方法二:重构为统一泛型方法(减少冗余)

如果需要支持多种类型,没必要单独写CoHttpGET_Texture、CoHttpGET_Json等方法,可将所有解析逻辑整合到一个泛型方法中:

public IEnumerator CoHttpGET<T>(string uri, System.Action<T> callback)
{
    using (UnityWebRequest request = UnityWebRequest.Get(uri))
    {
        yield return request.SendWebRequest();

        if (request.result == UnityWebRequest.Result.Success)
        {
            T result = default;
            // 根据T类型解析响应内容
            if (typeof(T) == typeof(Texture2D))
            {
                result = (T)(object)DownloadHandlerTexture.GetContent(request);
            }
            else if (typeof(T) == typeof(string))
            {
                result = (T)(object)request.downloadHandler.text;
            }
            else if (typeof(T).IsClass)
            {
                // JSON反序列化逻辑
                result = JsonUtility.FromJson<T>(request.downloadHandler.text);
            }

            callback?.Invoke(result);
        }
        else
        {
            // 请求失败时的回调处理,比如传入默认值
            callback?.Invoke(default);
        }
    }
}

注意事项

  • 必须通过typeof(T)确认类型匹配后再做转换,避免运行时类型转换异常
  • 可根据需求添加错误回调参数,更优雅地处理请求失败场景

内容的提问来源于stack exchange,提问作者Jacksonkr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:02:10