2015-05-27 14 views
3

Я пытаюсь создать валидатор атрибутов, который, учитывая список, должен убедиться, что в списке есть хотя бы один элемент.Итерация через динамические свойства от IList

Итак, у меня есть это на данный момент

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

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

    return false; 
} 

Моя проблема заключается в том, что я могу получить список с более чем одного элемента, но свойства всех этих элементов равны нулю, так что мне нужно перебирать над каждым свойством проверить их. И я не совсем уверен, как я могу достичь этого, не зная названия свойства.

+0

Какой у вас объект? Пользовательский? Если да, не могли бы вы также предоставить свойство под названием 'IsEmpty'? –

+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

Да, это настраиваемый тип, и я использовал объект, потому что мне нужно было использовать его с несколькими модулями viewModel, поэтому я искал более общее решение. Но я думаю, что я дам ему попробовать, и я дам вам знать, спасибо! – fmasche

-1

Я бы рекомендовал работать с IEnumerable только потому, что он работает с другими коллекциями.

Но кроме того. Вы можете использовать счетчик, который присутствует на каждом перечислимом. Как только вы найдете первые ненулевые элементы, верните истину:

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; 
} 
+0

Как это решить проблему? Где вы проверяете, являются ли дочерние свойства пустыми/пустыми? –

+0

im, считая все ненулевые элементы с 'enumerable.Count (e => e! = Null)' в последней строке (второй пример ... первый возвращает true, как только он находит ненулевой элемент в перечислителе) ... на самом деле забыл> = 1 раньше, исправил, что –

+0

извините, только что понял, я пропустил вопрос ... Я собираюсь исправить это завтра, если до сих пор требуется ответ ... нужно спать сейчас .. –

Смежные вопросы