c# - 使用类型动态返回 null 的枚举
问题描述
在序列化程序中,我有
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var enumText = reader.Value.ToString();
var enumType = Nullable.GetUnderlyingType(objectType) ?? objectType;
var defaultValue = GetDefault(objectType);
//TODO: If empty or invalid, return null
if (enumText == string.Empty)
{
return defaultValue;
}
...
}
objectType 是System.Nullable``1[[SomeEnum]]
SomeEnum 是普通枚举的地方
GetDefault
返回System.Nullable[SomeEnum]
value的实例应该是什么null
?
我试过
Activator.CreateInstance(objectType);
which 返回null
而不是(SomeEnum?)null
我也试过
public object GetDefault(Type t)
{
return GetType().GetMethod("GetDefaultGeneric").MakeGenericMethod(t).Invoke(this, null);
}
public T GetDefaultGeneric<T>()
{
return default(T);
}
这也返回 null
是否可以(SomeEnum?)null
从 Type 对象返回?
我用这样的单元测试来测试它:
var converter = new CustomStringEnumConverter();
var result = converter.ReadJson(_readerMock.Object, nullableEnumType, "bad value", new JsonSerializer());
result.Should().BeOfType(GetUnderlyingType(nullableEnumType));
result.Should().Be(GetValue(nullableEnumType, null));
如果我返回则测试通过,(SomeEnum?) null
但如果结果为则失败null
解决方案
null
从方法返回ReadJson
应该是您需要做的所有事情。Nullable<T>
是一种值类型(即使您可以测试并分配null
给它)。当它被装箱到引用类型(object
例如)时,它会做以下两件事之一:
- 如果由
Nullable<T>
NOT表示的值null
,那么Value
就像任何其他值类型一样被装箱。 - 如果
Nullable<T>
是表示一个null
值,那么结果实际上是null
.
当您取消装箱(从引用类型变为Nullable<T>
)时,会发生相反的情况;如果引用类型是null
,则Nullable<T>
创建一个新的实例并设置它没有值,但如果引用类型确实包含一个值,则Nullable<T>
创建一个新实例并设置引用类型中的值成为 的当前值Nullable<T>
。
调用GetValueOrDefault
不起作用的原因是因为Nullable<T>
该方法的返回类型是T
,它必须是值类型,所以它不能是null
。
推荐阅读
- javascript - JavaScript 值在变量中未正确评估,但作为字符串正常工作
- python - Pytorch 的随机选择?
- jenkins - 无头 chrome 浏览器已断开连接。当浏览器挂起或关闭时,或由于网络原因,可能会出现此问题
- ruby-on-rails - ROR API Trying to create a zip code search
- python - 对于具有随机索引的循环
- kubernetes - 如何使用 Terraform 和 ClusterIP 定义 Kubernetes 服务
- ios - SwiftUI:如何“放大”到平铺界面上的特定 CardView?
- azure-devops - Azure DevOps 中的 $(rev:r) 在构建管道或项目中是否相同?
- c++ - 将最大元素减半并创建一个新元素的动态数组 c++
- laravel - 在 Laravel 中获取贝宝付款详细信息时出现 403 错误