迭代IList的动态属性

时间:2015-05-27 19:24:58

标签: c# asp.net asp.net-mvc

我正在尝试创建一个属性验证器,给定一个列表,必须确保列表至少有一个元素。

所以,我现在有这个

public override bool IsValid(object value)
{
    var list = value as IList;

    if (list != null)
        return list.Count >= 1;

    return false;
}

我的问题是,我可以收到一个包含多个元素的列表,但是所有这些元素的属性都是null,所以我需要迭代每个属性来检查它们。而且我不确定如果不知道该物业的名称我怎么能实现这一点。

2 个答案:

答案 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;
}