1

所以我正在使用 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*/ }
    }
}

请不要太拘泥于每个类/变量的详细信息以及它是如何初始化的等等,因为这是一个试图代表我所问问题的想法的快速记录。我没有从我的代码中复制/粘贴它。

有没有办法,而不是只为“settingIndex”公开一个 int,我可以公开一个枚举并将 EnumA 或 EnumB 值显示给使用这个类的任何东西?

现在,任何必须获得选定设置索引的东西基本上都必须说“什么类型,A 还是 B?它是 A,好吧,所以 int 实际上意味着来自 A 的值,而不是来自 B 的值,将 int 强制转换为 EnumA。 ..” 或类似的东西,在这个旨在封装所有工作的类之外,它会很快变得复杂。

我在想是否有某种我可以做的继承或类似的事情,但我怀疑有。

4

2 回答 2

0

The following example wraps and unwraps an enum value via reflection, is it close to what you're looking for ?

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;
      }
    }
  }
}
于 2012-07-31T16:44:15.363 回答
0

代替数组,您可以使用Dictionary<Enum,ClassX>. 然后,只要您使用Enum而不是在int任何地方使用enums,您就会拥有完整的类型信息,并且可以区分各个枚举值。

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
于 2012-07-31T16:29:40.433 回答