我正在尝试创建一个属性验证器,给定一个列表,必须确保列表至少有一个元素。
所以,我现在有这个
public override bool IsValid(object value)
{
var list = value as IList;
if (list != null)
return list.Count >= 1;
return false;
}
我的问题是,我可以收到一个包含多个元素的列表,但是所有这些元素的属性都是null,所以我需要迭代每个属性来检查它们。而且我不确定如果不知道该物业的名称我怎么能实现这一点。
答案 0 :(得分:1)
根据您的评论,您有自定义类型。首先,在方法声明中使用它,不要使用对象。类型转换以及装箱和拆箱都很昂贵:
public override bool IsValid(IEnumerable<MyType> myObjects)
其次,通过名为IsEmpty
的属性
public class MyType
{
public bool IsEmpty
{
get
{
// define here when your type is empty
}
}
...
}
然后你的最终检查很简单:
public override bool IsValid(IEnumerable<MyType> myObjects)
{
return myObjects != null ? myObjects.Any() : false;
}
答案 1 :(得分:-1)
我建议使用IEnumerable,因为它适用于除列表之外的其他集合。
但除此之外。您可以使用每个可枚举的枚举数。一旦找到第一个非null元素,返回true:
public override bool IsValid(object value)
{
var list = value as IEnumerable;
var enumerator = list != null ? list.GetEnumerator() : null;
if (enumerator != null)
while(enumerator.MoveNext())
if(enumerator.Current != null)
return true;
return false;
}
第二个想法,你可能做得更好。通过调用列表中的Cast<object>()
,您可以获得一个通用的IEnumerable<object>
,您可以使用所有强大的linq并在您的枚举上调用Count(e => e != null)
:
public override bool IsValid(object value)
{
var list = value as IEnumerable;
var enumerable = list != null ? list.Cast<object>() : null;
return enumerable != null && enumerable.Count(e => e != null) >= 1;
}