检查列表

时间:2016-11-25 05:24:11

标签: c# .net linq asp.net-web-api

我有班级列表: -

 public class Requirement
    {
        public string Id { get; set; }
        public string desc { get; set; }
    }

列出lstRequirement

我在Id和desc的列表中有3条记录。 我想检查是否有任何项目没有保留为空。

为此我在下面使用: -

bool IsHavingValidTags = lstRequirement.All(_=> _.Id!=null && _.desc!=null);

上述Linq这个条件正常。 但我想把它作为Generic。

EG。将来可能会在Requirement类中添加5个属性。 添加属性后,我还必须在Linq中进行更改。

如何使所有属性的Linq条件通用? 我想检查列表中的任何属性是否保持为空。

请帮忙...... !!!

我试过With =>

 bool IsHavingValidTags = lstRequirement.All(_ => _ != null);

但没有给出理想的结果。

编辑1:

enter image description here

4 个答案:

答案 0 :(得分:2)

您可以编写一个使用如下反射的扩展方法:

public static class Extensions
{
    public static bool AreAllPropertiesNotNullForAllItems<T>(this IEnumerable<T> items)
    {
        var properties = typeof(T).GetProperties();
        return items.All(x => properties.All(p => p.GetValue(x) != null));
    }
}

然后像这样使用:

bool IsHavingValidTags = lstRequirement.AreAllPropertiesNotNullForAllItems();

编辑:

.NET Framework 4.5中引入了

PropertyInfo.GetValue(object obj)方法重载。如果您使用的是.NET Framework 4.0,则需要调用p.GetValue(x, null)

答案 1 :(得分:1)

而不是这个,你应该创建那些字段not null。这永远不会允许那些字段插入null。保持验证。像吼叫一样。

[Required(ErrorMessage = "First name is required")]
public string first_name { get; set; }
[Required(ErrorMessage = "Last name is required")]
public string last_name { get; set; }

答案 2 :(得分:1)

您可以使用foreach循环遍历列表中的所有对象。然后使用反射来获取列表中每个项目的所有属性,然后您可以遍历这些属性以执行空检查。

    Foreach  (var x in lstRequirement){
List prop = x.GetType().GetProperties();
Foreach  (var y in prop){
If (y == null){
IsHavingValidTag = true;
//Then you can return you method here or throw an Exception 
}
}

希望这有帮助。

答案 3 :(得分:0)

您应该添加一个静态方法来检查类的属性。我将向您展示以下示例。

而不是你的代码:

bool IsHavingValidTags = lstRequirement.All(_ => _ != null);

使用以下代码:

  bool flg = list.All(m => CheckProperties(m));
  public static bool CheckProperties<T>(T source)
        {
            bool rtnFlg = true;
            Type t = typeof(T);
            var properties = t.GetProperties();
            foreach (var prop in properties)
            {
                var value = prop.GetValue(source, null);
                if (value == null)
                {
                    return false;
                }
            }
            return rtnFlg;
        }