通用协程动作参数

时间:2018-04-13 08:32:01

标签: c# generics unity3d

我正在尝试创建一个GET / Post请求函数,该函数接受泛型参数,这是我的get方法:

public static IEnumerator Get<T>(Action<T> callback, string url)
{
    UnityWebRequest www = UnityWebRequest.Get(url);
    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        callback(www.error);
    }
    else
    {
        if (typeof(T) == typeof(String))
            callback(www.downloadHandler.text);
    }

}

这就是我使用它的方式:

public void GetTest()
{
    string url = "***";

    StartCoroutine(Http.Get<String>((response) => {
        if (response != null)
            Debug.Log(response);
    }, url));
}

但这一行:

callback(www.error);

抛出无法将字符串转换为T

的错误

这对我有意义,但我不知道如何解决这个问题,这就是我所尝试的

callback((T)www.error);

callback(www.error as T);

2 个答案:

答案 0 :(得分:2)

您不能直接调用回调,因为它是通用的。使用Convert.ChangeTypewww.errorwww.downloadHandler.text转换为Object,然后将其转换为T,最后调用回调Action并传递T 1}}到它。

public static IEnumerator Get<T>(Action<T> callback, string url)
{
    UnityWebRequest www = UnityWebRequest.Get(url);
    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        T t = (T)Convert.ChangeType(www.error, typeof(T));
        callback(t);
    }
    else
    {
        T t = (T)Convert.ChangeType(www.downloadHandler.text, typeof(T));
        callback(t);
    }
}

虽然这应该有效并且应该解决您的编译问题,但我认为没有必要这样做。在这里使用泛型完全没必要。只需使用stringbyte数组即可返回结果。

答案 1 :(得分:0)

您必须将字符串转换为T

这是我的解决方案: callback((T)Convert.ChangeType(www.error,typeof(T)));