动态类型的Unity协程回调



我可以在协程中使用回调,但是如果我想将参数传递到回调中,那么System.Action不喜欢我的泛型类型。

cannot convert from 'System.Action<T>' to 'System.Action<UnityEngine.Texture2D>'

public IEnumerator CoHttpGET<T>(string uri, System.Action<T> callback) {
if(typeof(T) == typeof(Texture2D)) yield return WeatherTracker.instance.StartCoroutine(CoHttpGET_Texture(uri, callback));
else 
... logic for other types
}

如何通过System返回一个泛型值?在这种情况下的操作?

额外

现在我正在为所有类型定义额外的方法,我需要例如HttpGET_Texture, _json, _string等的繁忙工作,等等

对于这种情况,我认为这样写就足够了。

CoHttpGET("http://123", (Texture2D tex2D)=>
{ 
});
CoHttpGET("http://123", (string tex2D) =>
{
});
public void CoHttpGET(string uri, System.Action<Texture2D> callback)
{
Texture2D result = null;
callback(result);
}
public void CoHttpGET(string uri, System.Action<string> callback)
{
string result = null;
callback(result);
}

一般情况下:可以使用is并包括像

这样的类型转换
if(callback is System.Action<Texture2D> textureCallback) yield return CoHttpGET_Texture(uri, textureCallback);

或甚至使用模式匹配,例如

public IEnumerator CoHttpGET<T>(string uri, System.Action<T> callback) 
{
switch(callback)
{
case System.Action<Texture2D> textureCallback:
yield return CoHttpGET_Texture(uri, textureCallback);
break;
default:
throw new ArgumentException();
}
}

注意你不需要调用内部的StartCoroutine。我认为,由于外部也返回IEnumerator,您无论如何已经将其作为协程运行,因此您可以直接yield return另一个IEnumerator

然而

对于我来说,使用重载会更有意义在你的用例

相关内容

  • 没有找到相关文章

最新更新