c# - 在 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 而不是空对象。我怎样才能实现返回值永远不会为空。
解决方案
不管这是对还是错的做法。问题是default(T)
将返回类型的默认值,即引用类型。如果你想要一个“空对象”(新对象),那么你将不得不使用新的约束并将它(实例化它)null
new
例子
private T ParseResult<T>(string queryResult) where T : new()
{
...
return new T();
}
注意:虽然有一些警告
新约束指定泛型类声明中的任何类型参数都必须具有公共无参数构造函数。要使用新的约束,类型不能是抽象的。
其他资源
默认值表达式
default(T)
生成类型的默认值T
。下表显示了为各种类型生成的值:
- 任何参考类型:
null
- 数值类型:
0
bool
:false
char
:\0
enum
:表达式 产生的值(E)0
,其中E
是enum
标识符。struct
: 将所有值类型字段设置为其默认值并将所有引用类型字段设置为null
.HasValue
可空类型:属性为false
且 Value 属性未定义的实例。
推荐阅读
- .net - dotnet watch 在升级到 .NET 6 后忽略端口号 launchsettings.json
- ruby-on-rails - Ruby on Rails:同时处理域和子域级别的 cookie
- c++ - 尝试删除初始化列表构造函数并不总是生效
- python - Python 正则表达式匹配包含两个或更少 o 字符的空格分隔的单词
- python - 从 Sci-Keras 而不是 Keras 导入 KerasRegresor 会改变我的 cross_val_score 的结果。我如何解释新数字?
- python - 如何将决策树中的阈值与其节点匹配?
- python - 替换列表中特定索引处的值
- flutter - 发布应用后蓝牙扫描无法正常工作
- azure-data-factory - 我可以在本地创建参数吗?
- python - 与每个部分的累积总和有关的这个问题的最佳方法是什么?