我可以在协程中使用回调,但是如果我想将参数传递到回调中,那么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
对于我来说,使用重载会更有意义在你的用例