我正在寻找一种将"空"属性值设置为"非空"值的方法。这些属性与一个对象相关联,并且存在多个对象的列表。
我遇到的问题是将"null"值转换为"非null"值,其中每个属性都有不同的类型。
到目前为止,我拥有的是一些嵌套循环和条件,以尝试识别 null 属性并将它们设置为非 null。
//loop through each object
for (int i = 0; i < objectList.Count; i++)
{
//loop through each object and each field within that object
foreach (var property in objectList[i].GetType().GetProperties())
{
var current_field_val = property.GetValue(objectList[i], null);
//null validation
if (current_field_val == null)
{
PropertyInfo current_field_data_type = objectList[i].GetType().GetProperty(property.Name);
if (current_field_data_type is String)
{
objectList[i].GetType().GetProperty(property.Name).SetValue(objectList[i], "");
}
else if (current_field_data_type is int)
{
objectList[i].GetType().GetProperty(property.Name).SetValue(objectList[i], 0);
}
else if (current_field_data_type is double)
{
objectList[i].GetType().GetProperty(property.Name).SetValue(objectList[i], 1);
}
else if (current_field_data_type is object)
{
objectList[i].GetType().GetProperty(property.Name).SetValue(objectList[i], "");
}
}
}
}
请原谅我的缩进不佳,VS 在来回复制时玩得不好。
正在寻找一种为任何引用类型生成默认非null
值的方法,那么恐怕您不走运。语言中没有通用机制可以为任何给定的引用类型提供非 null 默认值;默认值正好是 null
。
如果您需要处理的类型集是有限且可管理的,那么您可以对每个特定情况进行编码。
无论如何,这似乎很奇怪。你到底想实现什么?很可能有更好的方法来解决问题。
经过一段时间和研究,避免此问题的最佳方法是为将在反序列化过程中创建的对象创建构造函数/默认值,然后使用此问题中描述的设置 - 为什么当我使用 JSON.NET 反序列化时忽略我的默认值?将使用默认构造函数,并忽略 null 值。
objectsList = JsonConvert.DeserializeObject<List<RootObject>>(json_string, new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Populate,
NullValueHandling = NullValueHandling.Ignore
}
);