2014-02-07 3 views
1

У меня есть массив класса, и я хочу итерации по полям/свойствам этого класса. У меня есть попытки, используя следующий код, но он возвращается нульИтерация по полям/свойствам массива класса в #

foreach (var account in invalidAccount) 
{ 
var invalidData = from p in typeof(InvalidAccounts).GetProperties() 
    where p.GetValue(account).ToString().ToLower().Equals("false") 
              select p.Name; 
} 
+0

Вы пробовали разбивая для выражения LINQ таким образом, чтобы вы получите поэтапные результаты посредника, который вам может проверить на отладку? –

ответ

1

Чтобы получить все свойства - используйте код как

List<PropertyInfo> allProperties = 
    typeof (InvalidAccounts).GetProperties(BindingFlags.Instance | BindingFlags.Public) 
    .ToList(); 
//Write out all properties to a console as a demo 
allProperties.ForEach(Console.WriteLine); 

Чтобы получить все поля - используйте код как

List<FieldInfo> allFields = 
    typeof(InvalidAccounts).GetFields(BindingFlags.Instance | BindingFlags.NonPublic) 
    .ToList(); 
//Write out all fields to a console as a demo 
allFields.ForEach(Console.WriteLine); 

Я думаю, вам нужно изменить исходный код, чтобы указать соответствующие обязательные флаги - так ваш запрос хотел бы немного как

PropertyInfo myAccount = typeof (InvalidAccounts) 
    .GetProperties(BindingFlags.Public | BindingFlags.Instance) 
    .First(x => x.GetValue(account, null) 
       .ToString() 
       .Equals("false", StringComparison.InvariantCultureIgnoreCase)); 

Я угадываю здесь немного - потому что я «Мне трудно понять, чего вы пытаетесь достичь (точнее - почему).

Вы должны указать обязательные флаги, чтобы указать, как свойство существует на объект, который вы заинтересованы в Ссылка:. http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags(v=vs.110).aspx

+0

Я пытаюсь получить имя всех свойств, для которых значение равно false в массиве класса InvalidAccounts. –

+0

Используйте 'where' вместо 'first' then. Запрос должен по-прежнему работать, если вы правильно указали флаги привязки. – Jay

0

Приведенный выше код работает отлично, но если и только если у вас есть общие свойства экземпляра на классе. Чтобы получить поля, вы должны использовать .GetFields, поскольку они по своей сути отличаются от свойств, и если вы хотите получить что-то большее, чем свойства/значения публичного экземпляра, вам нужно будет использовать одну из перегрузок, которая поддерживает Binding Flags.

Обратите внимание, что противоположные флаги (например, BindingFlags.Public | BindingFlags.NonPublic) работают очень хорошо и будут извлекать все элементы, которые соответствуют любому из указанных флагов.

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