通用T - 创建新实例

时间:2017-06-16 11:46:54

标签: c# generics

我有一个函数来反序列化我从Api获得的任何类型的对象。  如果有错误,我想返回一个T类型的新对象。

我尝试用return new T()来做,但我收到错误:

  

'T'必须是具有公共无参数的非抽象类型   构造函数,以便在泛型类型中使用它作为参数'T'   方法

我的代码出了什么问题?

[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
        internal static T DeserializeObject<T>(this JsonSerializer serializer, string value) 
        {
            try
            {
                using (var stringReader = new StringReader(value))
                {
                    using (var jsonTextReader = new JsonTextReader(stringReader))
                    {
                        return (T)serializer.Deserialize(jsonTextReader, typeof(T));
                    }
                }
            }

            catch {

                return GetDefault<T>(); //This line returns the error
            }  
        }


        public static T GetDefault<T>() where T : new()
        {
            if (typeof(IEnumerable).IsAssignableFrom(typeof(T)))
            {
                return new T();
            }
            return default(T);
        }

1 个答案:

答案 0 :(得分:3)

DeserializeObject<T>你正在打电话

GetDefault<T>()

具有类型参数约束where T : new(),但DeserializeObject<T>的{​​{1}}不受约束。您还必须将约束添加到T

DeserializeObject<T>