【问题标题】:Generic T - create new instance [duplicate]通用 T - 创建新实例 [重复]
【发布时间】:2017-06-16 11:46:54
【问题描述】:

我有一个函数可以反序列化从 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);
        }

【问题讨论】:

  • @Cody Gray 你没看到吗?他已经使用了类型约束!问题是另一个问题
  • @adjan OP 仅在一处使用类型约束。有错误的行在没有类型约束的方法中。所以它仍然是重复的。
  • @Stijn 但另一个问题在哪里说这是在每种方法中都有它的要求?
  • @adjan 答案中第一个代码块下方的段落解释了这一点。
  • @AndersonPimentel 我知道这一点。我只是看不出重复的答案在哪里解释了这一点。

标签: c# generics


【解决方案1】:

您正在拨打DeserializeObject&lt;T&gt;

GetDefault<T>()

具有类型参数约束where T : new(),但DeserializeObject&lt;T&gt;T 不受约束。您还必须将约束添加到DeserializeObject&lt;T&gt;

internal static T DeserializeObject<T>(this JsonSerializer serializer, string value) : where T : new()

【讨论】:

  • 非常感谢,成功了
  • @adjan 我承认我是在关闭 Visual Studio 的情况下回答的。 =) 刚刚删除了评论。
  • @Rahul 我明白了,现在我明白了。刚刚删除了评论。
  • @adjan,感谢您在回答中的编辑。谢谢
  • @adjan,有道理,我很确定他们可能并没有真正理解这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2023-04-08
  • 1970-01-01
  • 2012-02-25
相关资源
最近更新 更多