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

