【问题标题】:Looping through a model to check for propery that is null循环遍历模型以检查为空的属性
【发布时间】:2014-09-08 16:11:42
【问题描述】:

我在 MVC 应用程序中有一个 Auto 模型,它具有诸如

之类的属性
public string Id { get; set; }
public bool IsOOS{ get; set; }
public string Make { get; set; }
public string Model { get; set; }
[XmlElement(IsNullable = true)]
public DateTime? RegisteredDate { get; set; }

还有一个有这个的类...

var a = new Auto(){
Id = someIDcomingfromServer,
IsOOS = someOOScomingFromServer,
... 
}

我想要做的是……循环遍历这些属性,看看现在是否有任何属性为空。

如何循环查看这些属性(Id、IsOOS 等)是否包含 null?

谢谢

【问题讨论】:

  • 您是要检查输入(例如someIDcomingfromServer)还是在对象创建后检查?如果其中一个 null,你想做什么?设置默认值?
  • IsOOS 不能null
  • 创建后。此时如果任何属性包含 null 来捕获该值并抛出异常。
  • 如果您想动态循环遍历对象的每个属性,请查看反射:stackoverflow.com/questions/4879197/…
  • @HaukurHaf 我对此有点新意,因为这是一个昂贵的过程,有没有其他选择?

标签: c# asp.net .net


【解决方案1】:

可以使用反射来获取所有属性的集合并检查每个属性是否为空,但为什么不直接明确呢?

if (Id == null || Make == null || Model == null || RegisteredDate == null)

它更短,更容易理解,没有反射的性能开销,并且不需要那么太多的维护。没有一个“魔术”函数可以告诉您类的任何属性是否为空。

我会注意不要以牺牲系统性能为代价来缩短开发时间。在开发上花费一点额外的时间(即使它很乏味)可以对系统性能产生巨大的影响。

也就是说,单个 Linq 查询将是:

bool hasNull = 
    a.GetType()
     .GetProperties()
     .Any(prop => prop.GetValue(a, null) == null);

【讨论】:

  • 好一个,但不幸的是这个模型包含数百个......不是我的代码......
【解决方案2】:

您可以为此使用反射。从您的实例中获取所有 PropertyInfos 并检查它们的值。 像这样的:

foreach (PropertyInfo pinfo in obj.GetType().GetProperties())
{
    object value = pinfo .GetValue(obj, null);
}

注意,反射是一个昂贵的过程。

【讨论】:

  • 我知道而且我应该提到它,但是还有其他选择吗?
  • 是的,一一检查数值。
【解决方案3】:

您可以对其进行序列化并在字符串中搜索 />,因为序列化程序将 null 输出为 并将空输出为 。这可能会捕获一些空对象以及空对象。如果您只想要空值,则需要将它们设置为可空值并在属性中查找 xsi:nil="true"。

*我发布此解决方案是因为您想要另一种选择。其他人的建议是建议的方式。

【讨论】:

  • 你说得对,我找不到更好的方法......我会参考其他人的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 2017-10-27
  • 2016-03-11
  • 2023-01-11
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
相关资源
最近更新 更多