我有班级列表: -
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:
答案 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;
}