我正在尝试创建一个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);
答案 0 :(得分:2)
您不能直接调用回调,因为它是通用的。使用Convert.ChangeType
将www.error
或www.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);
}
}
虽然这应该有效并且应该解决您的编译问题,但我认为没有必要这样做。在这里使用泛型完全没必要。只需使用string
或byte
数组即可返回结果。
答案 1 :(得分:0)
您必须将字符串转换为T
这是我的解决方案: callback((T)Convert.ChangeType(www.error,typeof(T)));