2015-12-26 5 views
-2

Я формирую Список объектов, как показано ниже, Control is List of Enum.Как сравнить список анонимного объекта с Enum в C#

Ex:

public enum Controls 
     { 
      Undefined = 0, 
      [EnumReferenceTypeField(DisplayName = "Edit")] 
      Edit = 1, 

      [EnumReferenceTypeField(DisplayName = "Save")] 
      Save = 2, 
} 

Список Построение действия уже написан код, я не разрешается изменять.

var actions = new List<object>(); 
       foreach (var control in Controls) 
       { 
        actions.Add(new 
        { 
         c = (int)control , 
         t = control.ToString() 
        }); 
       } 

и проверка состояния, как показано ниже,

if (actions.Exists(a => a == (object)Enums.Controls.Save)) 
    actions.Remove(Enums.Controls.Submit); 

Даже если я конвертировать Enum объект типа Exists условия не удовлетворяет, даже если список действий есть Сохранить действие. Если я нахожусь над действием во время выполнения, он должен иметь значения «2» и «Сохранить». Я хочу проверить, что Save существует и выполняет некоторую логику.

+4

вы сравниваете анонимный объект с объектом Enum. они никогда не равны. возможно, вы хотите сравнить enum с 'a.c'? вы должны использовать 'dynamic' вместо' object'. или лучший способ - создать для него собственный класс. –

+0

Что такое 'Controls'? – poke

+0

Контроль - список Enum. Но мне нужно создать анонимный объект, потому что мне нужно значение int и строка для проверки UI. – Govind

ответ

-1

После некоторого анализа я пробовал себя и под кодом работает отлично.

создал анонимный объект из перечисления, как показано ниже,

object saveAction= new 
      { 
       c = (int)Enums.Controls.Save, 
       t = Enums.Controls.Save.ToString() 
      }; 
object submitAction = new 
     { 
      c = (int)Enums.Controls.Submit, 
      t = Enums.Controls.Submit.ToString() 
     }; 

if (actions.Exists(a => a.Equals(saveAction))) 
       { 
        actions.Remove(submitAction); 
       } 

Равно работает только не "==".См ниже ссылку

http://www.informit.com/articles/article.aspx?p=1237024&seqNum=4

3

Существуют различные вещи, здесь не так:

  1. Если Controls действительно является enum, как вы показали, то вы не можете перечислить его с

    foreach (var control in Controls) // won't work if Controls is an enum type 
    

    Вместо этого вы можете использовать что-то вроде:

    var controls = 
        Enum 
        .GetValues(typeof(Controls)) 
        .Cast<Controls>() 
        .ToList(); 
    
    foreach (var control in controls) 
        ... 
    
  2. С actions - это List<object>, и элементы, которые вы добавляете к нему, имеют анонимный тип, вы не можете получить доступ к элементам элементов. Либо actions должен быть неявно напечатал:

    var actions = 
        controls // as above 
        .Select(control => new { 
         c = (int)control , 
         t = control.ToString() 
        }).ToList(); 
    

    или вам нужно использовать не анонимный тип и бросил на него:

    class MyAction { 
        public int c { get; set; } 
        public string t { get; set; } 
    
        public MyAction(Controls control) { 
         c = (int)control; 
         t = control.ToString(); 
        } 
    } 
    
    var actions = new List<MyAction>(); 
    foreach (var control in controls) 
        actions.Add(new MyAction(control)); 
    
  3. Если Controls определяется, как вы говорите, не существует такого значения как Controls.Submit.

  4. Если Controls действительно является enum, то это не имеет никакого смысла иметь строку:

    if (actions.Exists(a => a == (object)Enums.Controls.Save)) 
    

    потому, что члены Controls являются статическими и известны во время компиляции. Вы должны уметь рассуждать о них сами.

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

+0

Я не получаю a.value. В случае, если условие a не имеет никакого свойства "value". – Govind

+0

Я не могу изменить формирование списка объектов, его старый код и на основе того, что многие логики написаны. Мне нужно написать логику, если какой-то элемент управления существует, а затем удалить некоторый элемент управления. – Govind

+0

Не получаю a.c в intellisense, его вообще не показывают. во время выполнения я мог видеть, что действие имеет, 2 значения, а именно c = 1 и t = save. но при кодировании оба c и t недоступны. – Govind

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