繁体   English   中英

在2种枚举类型之间切换?

[英]Switching Between 2 Enumeration Types?

因此,我正在使用Compact Framework 2.0编写C#应用程序,我想知道是否可以做比我脑子里计划的要简单的事情。
如果有其他框架的完整或紧凑的答案,但不是针对该框架的答案,我还是想听听他们的意见,这就是为什么标记此时不包括紧凑框架2.0的原因。

实际上,用户将能够选择要为其设置设置的项目是A型还是B型,然后选择他们要在该分类下使用/设置的特定设置。 我想使用枚举在大多数情况下使代码清晰易读,因为这是我的工作场所,如果我不在身边,人们应该可以阅读它。

我的想法:
以下是适用于全局的应用程序,而不是特定的类:

enum EnumTypes
{
    A, B,
    Num_Types,
}
enum EnumA
{
    Setting1 = 0, Setting2, Setting3, //and so on...
    Num_A_Settings, //WILL be different from B
}
enum EnumB
{
    Setting1 = 0, Setting2, Setting3, //and so on...
    Num_B_Settings, //WILL be different from A
}

下面是该类将使用值完成其工作的函数/属性的示例 ,显然仅暴露了其他类将需要的内容。

public class SettingClass
{
    public EnumTypes TypeUsed {/*basic get/set for property*/}
    public int SelectedSettingIndex {/*basic get/set for property*/}
    private ClassX[][] _settingsData = new ClassX[(int)Num_Types][];

    public SettingClass()
    {
        for(int i = 0; i < (int)EnumTypes.Num_Types;i++)
        {
            if((EnumTypes)i == EnumTypes.A)
            {
                _settingsData[i] = new ClassX[(int)EnumA.Num_A_Settings];
                //for loop for initializing each ClassX instance for A
            }
            else if((EnumTypes)i == EnumTypes.B)
            {
                _settingsData[i] = new ClassX[(int)EnumB.Num_B_Settings];
                //for loop for initializing each ClassX instance for B
            }
    }

    //just an example
    public IncrementSetting()
    {
        if(TypeUsed == EnumTypes.A)
        { /*range checking using Num_A_Settings, increments SelectedSettingIndex*/ }
        else if(TypeUsed == EnumTypes.B)
        { /*range checking using Num_B_Settings, increments SelectedSettingIndex*/ }
    }
}

请不要对每个类/变量具有什么以及如何对其进行初始化以及诸如此类的细节感到困惑,因为这是一个想法的快速总结,试图表达我的要求。 我没有从代码中复制/粘贴此内容。

有没有一种方法可以公开一个枚举并将EnumA或EnumB值显示给使用此类的任何对象,而不是只为“ settingIndex”公开一个int?

现在,必须获取所选设置索引的所有内容都必须基本上说“是什么类型,A还是B?是A,好的,因此int实际上意味着A中的值,而不是B中的值,将int转换为EnumA。 ..”或类似的内容,可能会很快变得复杂,超出了该类的范围,该类旨在封装所有工作。

我在考虑是否可以进行某种继承或类似的继承,但是我怀疑是否存在。

除了数组,还可以使用Dictionary<Enum,ClassX> 只要然后你用Enum ,而不是int无论您使用的enum S,你周围有完整的类型信息,并可以分辨单个枚举值。

AC# enum具有有趣的属性,由于性能原因,它可以在需要的任何地方都像int一样工作,但是当您需要在其值上附加类型信息时,成为一个成熟的object很高兴。

我刚刚用来测试所有这些的一些LINQPad代码:

void Main()
{
  Dictionary<Enum,object> dict = new Dictionary<Enum,object>();
  dict.Add(asdf.lkj,null);
  dict.Add(qwer.oiu,null);
  Console.WriteLine(dict.ContainsKey(qwer.oiu));
  Console.WriteLine(dict.ContainsKey(asdf.lkj));
  Console.WriteLine(dict.ContainsKey(qwer.zxcv));
}

enum asdf {
  lkj
}

enum qwer {
  oiu,
  zxcv
}

及其输出

True
True
False

以下示例通过反射来包装和解开枚举值,它是否与您要查找的内容接近?

namespace App
{
  class Program
  {
    static void Main(string[] args)
    {
      var val = new EnumWrapper(B.f);
      Enum en = val.EnumVal;
      Console.WriteLine("{0}.{1}",en.GetType().Name,en);
    }
  }
  enum EnumType { A, B }
  enum A { a, b, c = 34, d = 12 }
  enum B { a, b, e = 54, f = 56 }
  class EnumWrapper
  {
    public EnumWrapper(Enum i)
    {
      type = (EnumType) Enum.Parse( typeof(EnumType), i.GetType().Name );
      index = Convert.ToInt32(i);
    }
    public EnumType type;
    public int index;
    public Enum EnumVal {
      get {
        Enum c = (Enum)Enum.ToObject(
          Type.GetType(
            "App." + type
          ), index
        );
        return c;
      }
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM