0

我有这种非工作方法。其中类型 T 有时可以是“字符串”。当然反序列化没有意义,所以我想检查一下 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)));
            }
        }
    }
4

2 回答 2

0

由于编译器无法检查您是否可以将 a 转换stringT,因此您需要先将 a 转换stringobject

return (T)(object)str;

它之所以有效,是因为您总是可以从stringto投射到任何东西object,也可以从objectto 投射到任何东西。如果底层类型不同,它可能会在运行时失败。

于 2013-11-13T11:54:24.540 回答
0

好吧,你知道Tstring那一点上,我知道,“运行时”(CLR)也知道,但糟糕的编译器不知道它是字符串。

要使其工作,您需要将其转换为T

return (T)(object)str;

注意:强制转换为object是必需的,因为您不能直接将字符串转换为T.

于 2013-11-13T11:56:28.627 回答