我有这种非工作方法。类型T有时可以是" string"。当然反序列化没有意义,所以我想检查T是否为字符串并在反序列化之前返回结果。我怎么能得到这个?
private T SendRequest<T, E>(string url, E body, Guid? token)
{
var request = (HttpWebRequest) WebRequest.Create(url);
request.Method = body != null ? "POST" : "GET";
request.ContentType = "application/json";
if (token != null)
{
request.Headers.Add("Token", token.ToString());
}
if (body != null)
{
var bodyWriter = new StringWriter();
_serializer.Serialize(new JsonTextWriter(bodyWriter), body);
var bytes = Encoding.UTF8.GetBytes(bodyWriter.ToString());
request.ContentLength = bytes.Length;
using (var requestStream = request.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
}
}
using (var response = request.GetResponse())
{
using (var responseStreamReader = new StreamReader(response.GetResponseStream()))
{
var str = responseStreamReader.ReadToEnd();
if (typeof(T) == typeof(String))
{
return str; // <-- Cannot convert expression type 'string' to return type 'T'
}
return _serializer.Deserialize<T>(new JsonTextReader(new StringReader(str)));
}
}
}
答案 0 :(得分:0)
由于编译器无法检查您是否可以将string
转换为T
,因此您需要先将string
转换为object
:
return (T)(object)str;
它之所以有效,是因为您始终可以从string
转换为object
,也可以从object
转换为任何内容。如果基础类型不同,它可能会在运行时失败。
答案 1 :(得分:0)
那么,你知道T
当时是string
,我知道,“运行时”(CLR)也知道,但是糟糕的编译器不知道它是字符串。
要使其正常工作,您需要将其投射到T
return (T)(object)str;
注意:由于您无法直接将字符串转换为object
,因此需要强制转换为T
。