【问题标题】:Iterate through dynamic properties from IList遍历 IList 中的动态属性
【发布时间】:2015-05-29 15:34:52
【问题描述】:

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

所以,我暂时有这个

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

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

    return false;
}

我的问题是,我可以接收一个包含多个元素的列表,但是所有这些元素的属性都是空的,所以我需要遍历每个属性来检查它们。而且我不确定如何在不知道属性名称的情况下实现这一目标。

【问题讨论】:

  • 你得到什么对象?定制的?如果是这样,你能不能也提供一个名为IsEmpty的属性?
  • 我不太清楚你所说的属性是什么意思。是否意味着列表的实际元素不应为非空,或者您是否要检查每个元素的每个属性是否为非空?

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


【解决方案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;
}

【讨论】:

  • 是的,是一种自定义类型,我使用的是一个对象,因为我需要将它与多个视图模型一起使用,所以我正在寻找一个更通用的解决方案。但我想我会尝试这种方式,我会告诉你,谢谢!!
【解决方案2】:

我建议使用 IEnumerable,因为它适用于列表以外的集合。

但除此之外。您可以使用枚举器,它存在于每个可枚举项上。一旦找到第一个非空元素,就返回 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&lt;object&gt;(),您将获得一个通用的IEnumerable&lt;object&gt;,您可以在其上使用所有强大的linq,只需在您的可枚举对象上调用Count(e =&gt; 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;
}

【讨论】:

  • 这如何解决问题?您在哪里检查子属性是否为空/null?
  • 我在最后一行用enumerable.Count(e =&gt; e != null) 计算所有非空元素(第二个例子......第一个在枚举器中找到一个非空元素后立即返回真)......实际上忘记了 >= 1 之前,修复了这个
  • 抱歉,我刚刚意识到我看错了这个问题......如果到那时仍然需要答案,我明天会解决这个问题......现在需要睡觉......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2016-08-11
  • 2016-05-12
  • 2010-10-26
  • 2011-10-03
  • 2012-03-02
  • 2011-12-30
相关资源
最近更新 更多