什么是T型对象应该是什么意思?

时间:2013-12-25 02:17:32

标签: .net json

T型的对象应该是什么意思?

我似乎无法理解这一点。将一个JSON字符串解析为一个数组本来就是vbscript中最简单的东西..为什么它在.NET中更加复杂?

JavaScriptSerializer js = new JavaScriptSerializer();
//List<string> listJSON = new List<string>();

//IList<KeyValue> jList = js.Deserialize<IList<KeyValue>>(strJSON);
//List<KeyValue> persons = new JavaScriptSerializer()
//    .Deserialize<List<KeyValue>>(strJSON);
//Console.WriteLine(persons.Count);

Array arrJSON = js.Deserialize<KeyValue[]>(strJSON);

public class KeyValue
{
    public int id {get; set;}
    public string name {get; set;}
}

错误是:没有为'WCFPull.KeyValue []'的类型定义无参数构造函数。

尚未填充数组 更新的代码:

namespace LoLSummoner
{
    public class KeyValue
    {
        public int id {get; set;}
        public string name {get; set;}
        public int profileIconId {get; set;}
        public int summonerLevel {get; set;}
        public int revisionDate {get; set;}
    }
}
namespace LoLSummoner
{
    public class Summoner : ISummoner
    {

        public int GetSummonerID(string SummonerName)
        {
            int summonerId = 0;

            WebClient client = new WebClient();
            string strJSON = client.DownloadString("http://prod.api.pvp.net/api/lol/na/v1.2/summoner/by-name/" + SummonerName + "?api_key=xxx");

            JavaScriptSerializer js = new JavaScriptSerializer();

            KeyValue[] arrJSON = js.Deserialize<List<KeyValue>>(strJSON).ToArray();

            return summonerId;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

T型是泛型 - http://msdn.microsoft.com/en-us/library/512aeb7t.aspx

除其他外,它允许客户端在实例化时指定对象类型。

答案 1 :(得分:2)

T是通用类型参数。请参阅Generics (C# Programming Guide)

  

泛型向.NET Framework引入了类型参数的概念,这使得设计类和方法成为可能,这些类和方法推迟了一个或多个类型的规范,直到通过客户端代码声明和实例化类或方法。

     

.. 通过使用泛型类型参数T,您可以编写其他客户端代码可以使用的单个类,而不会产生运行时强制转换或装箱操作的成本或风险。

(在这种情况下,JavaScriptSerializer也使用类型信息来确定如何将JSON解析为结果对象 - 这里它指示序列化程序将JSON数组解析为List of < / em>某种类型。)

代码失败,因为有Constraint on T,即:T : new()

  

使用T : new(),类型参数必须具有公共无参数构造函数[以便可以简单地创建类型为T的新实例]。

(但没有数组类型可以传递此约束;如果他们这样做了,那么最好的结果就是创建数组的能力,因为数组有一个固定大小。)


要反序列化JSON,请使用最初显示的List<T>类型(请注意使用具体类型):

IList<KeyValue> arrJSON = js.Deserialize<List<KeyValue>>(strJSON);

(对IList<KeyValue>使用T将不起作用,因为它是一个无法实例化的接口,并且T : new()约束失败。但是,List<T>实现了{{} 1}}这就是为什么可以声明变量使用接口的原因。)

或使用var and type inference保存一些打字:

IList<T>

(隐式推断var arrJSON = js.Deserialize<List<KeyValue>>(strJSON); 变量的类型为arrJSON。)

或者使用ToArray可枚举扩展方法真正取回List<KeyValue>

KeyValue[]

(它最初仍会被反序列化为List, I 通常会将其保存为List / Enumerable。)