'MyObject []'必须是非抽象类型,带有公共无参数构造函数,以将其用作参数'T'

时间:2017-06-29 08:12:10

标签: c# generics

在MyRequest课程中,我有:

public static T RetrieveData<T>(Uri uri) where T : class, new()
{
        return requestData<T>(query);
}

Uri返回一个字符串数组,例如:

{

 "prop1": "JOHN",
 "prop2": "JULIE",
 "value": 9

}, 
{

 "prop1": "KATE",
 "prop2": "Ryan",
 "value": 8

}

这就是我调用方法的方法:

var obj = MyRequest.RetrieveData<MyObject[]>("http://.....");   

这就是MyObject的定义方式:

public class MyObject
    {
        public string prop1;
        public string prop2; 
        public double value; 
    }

这是我得到的错误:

  

MyObject []'必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法'MyRequest.RetrieveData(uri)'中将其用作参数'T'

当我调整uri以返回一个包含1个元素的数组并调用它时,我得到了正常工作的方法:

var obj = MyRequest.RetrieveData<MyObject>("http://....."); 

而不是

MyObject[]

但我真的需要使用数组。 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

因为类型T []是固定大小数组并且没有无参数构造函数。很明显,固定大小的数组需要此大小。例如:

{
    "country_id" : 328.0,
    "country_name" : "UK",
    "regions" : [ 
        {
            "region_id" : 1.0,
            "region_name" : "west midlands",
            "govenor_id" : "007"
        }, 
        {
            "region_id" : 2.0,
            "region_name" : "east midlands",
            "govenor_id" : "008"
        }
    ],
    "cities" : [ 
        {
            "city_id" : 1.0,
            "region_id" : 1.0,
            "city_name" : "Birmingham"
        }, 
        {
            "city_id" : 2.0,
            "region_id" : 1.0,
            "city_name" : "coventry"
        }, 
        {
            "city_id" : 3.0,
            "region_id" : 1.0,
            "city_name" : "warsaw"
        }, 
        {
            "city_id" : 4.0,
            "region_id" : 2.0,
            "city_name" : "dudley"
        }, 
        {
            "city_id" : 5.0,
            "region_id" : 2.0,
            "city_name" : "blabla"
        }
    ]
}

你不能初始化这样的东西:

var foo = new bar[0];
var foo = new bar[123];
var foo = new bar[count];

因此很明显new()量词不能与固定大小的数组一起使用。

答案 1 :(得分:1)

您应该尝试反序列化为List<T>而不是数组作为您的JSON库(可能是JSON.Net,但很难从您的代码中猜出)要求类型具有构造函数。例如:

var obj = MyRequest.RetrieveData<List<MyObject>>("http://.....");