首页 > 解决方案 > 在 C# 中使用类型作为函数参数创建通用对象

问题描述

我正在尝试创建一个通用函数来使用 Newtonsoft 解析我的 json 结果:

private T ParseResult<T>(string queryResult)
{
    Result res = JsonConvert.DeserializeObject<Result>(queryResult);

    if (res.Success == 1)
    {
        try
        {
            return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(res.data));
        }
        catch (Exception)
        {
            return default(T);
        }
    }
    return default(T);
}

如果 Success 或解析有问题,我想返回一个 T 的空对象(当前列出或只是自定义对象)。

我的问题是当前的解决方案返回 null 而不是空对象。我怎样才能实现返回值永远不会为空。

标签: c#jsongenericsxamarindefault

解决方案


不管这是对还是错的做法。问题是default(T)将返回类型的默认值,即引用类型。如果你想要一个“空对象”(新对象),那么你将不得不使用新的约束并将它(实例化它)nullnew

例子

private T ParseResult<T>(string queryResult) where T : new()
{

    ...

    return new T();

}

注意:虽然有一些警告

新约束(C# 参考)

新约束指定泛型类声明中的任何类型参数都必须具有公共无参数构造函数。要使用新的约束,类型不能是抽象的。


其他资源

默认值表达式(C# 编程指南)

默认值表达式default(T)生成类型的默认T。下表显示了为各种类型生成的值:

  • 任何参考类型:null
  • 数值类型:0
  • boolfalse
  • char\0
  • enum:表达式 产生的值(E)0,其中Eenum标识符。
  • struct: 将所有值类型字段设置为其默认值并将所有引用类型字段设置为null.
  • HasValue可空类型:属性为false且 Value 属性未定义的实例。

推荐阅读