C# 在两种枚举类型之间切换?

C# 在两种枚举类型之间切换?,c#,enumeration,C#,Enumeration,因此,我正在使用Compact Framework 2.0编写一个C#应用程序,我想知道我是否可以做一些比我想象的更简单的事情。 如果有其他框架的答案,完整的或紧凑的,但不是这一个,我仍然希望听到他们,这就是为什么标签不包括紧凑的框架2.0在这一点上的时间 实际上,用户将能够选择他们想要设置的项目是类型A还是类型B,然后选择他们想要在该分类下使用/设置的具体设置。我希望使用枚举来保持代码的易读性,因为这是为了我的工作场所,如果我不在,人们应该能够阅读它 我的想法: 以下内容对于应用程序是全局的,

因此,我正在使用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*/ }
    }
}
公共类设置类
{
公共EnumTypesTypeUsed{/*basic get/set for property*/}
public int SelectedSettingIndex{/*基本获取/设置属性*/}
私有类X[][]\u设置数据=新类X[(int)Num\u类型][];
公共设置类()
{
对于(int i=0;i<(int)EnumTypes.Num_Types;i++)
{
如果((EnumTypes)i==EnumTypes.A)
{
_settingsData[i]=新类X[(int)EnumA.Num_A_设置];
//for循环,用于初始化
}
else if((EnumTypes)i==EnumTypes.B)
{
_settingsData[i]=新类X[(int)EnumB.Num_B_设置];
//用于初始化B的每个ClassX实例的for循环
}
}
//只是一个例子
公共增量设置()
{
if(TypeUsed==EnumTypes.A)
{/*使用Num\u A\u设置进行范围检查,递增SelectedSettingIndex*/}
else if(TypeUsed==EnumTypes.B)
{/*使用Num_B_设置进行范围检查,递增SelectedSettingIndex*/}
}
}
请不要陷入每个类/变量都有什么、如何初始化以及诸如此类的细节中,因为这是一个快速编写的想法,试图表达我的问题。我没有从代码中复制/粘贴这一点

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

现在,任何必须获得所选设置索引的东西基本上都必须说“什么类型,A或B?它是A,好的,所以int实际上是指A中的值,而不是B中的值,将int转换为EnumA…”或类似的内容,这可能会很快变得复杂,超出了用于封装所有工作的类的范围


我在考虑是否有某种继承我可以做或类似,但我怀疑有。

你可以使用
字典而不是数组。那么只要你使用
Enum
而不是
int
,无论你在哪里使用
Enum
你都会有完整的类型信息,并且可以告诉你两个枚举值分开

C#
enum
有一个有趣的特性,它可以像
int
一样在任何地方运行,因为性能原因,但是当您需要将类型信息附加到它的值时,它很高兴成为一个成熟的
对象

我刚才用来测试所有这些的一些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
}

下面的示例通过反射包装和展开枚举值,它是否接近您要查找的值

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

用户(程序员)是在编写代码时决定使用EnumA还是EnumB,还是在运行时决定使用EnumA还是EnumB?我不确定我是否能正确回答这个问题……这不是它的用途,但这是一个很好的类比:想象一个菜单页面说“你想查看哪个菜单,菜单a还是菜单B?”然后是所选的菜单(查看特定菜单中的设置)。用户(即操作员,而不是程序员)总是可以返回并说“好的,现在让我们看看菜单B”然后显示菜单B的设置。同样,这是一个类比,我不确定是否允许我使用细节。另一个可能更准确的类比是列出德国车或日本车,并在顶部说“你想要德国车还是日本车?”在显示它们的列表之前,使用这两种类型的枚举作为索引来获取每种类型汽车的数据,即carData[(int)CarSource.Japanese][(int)GermanCars.toyotacarola].vehiclehight。
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;
      }
    }
  }
}