如何在c#中将匿名对象列表与Enum进行比较

时间:2015-12-26 17:00:51

标签: c# enums

我正在形成如下对象列表,Control是枚举列表。

例如:

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条件也不满意,即使动作列表具有Save action。如果我在运行时将鼠标移动到操作上,则必须使用值&#34; 2&#34;和&#34;保存&#34;。我想检查保存是否存在并执行一些逻辑。

2 个答案:

答案 0 :(得分: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. 由于actionsList<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的成员是静态的并且在编译时是已知的。你应该能够自己解释一下。

  5. 很可能,您发布的代码在关键方面不完整或不正确。

答案 1 :(得分:-2)

经过一些分析后,我尝试了自己,下面的代码工作正常。

从枚举中创建匿名对象,如下所示

 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