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

次の例は、リフレクションを介して列挙値をラップおよびラップ解除します。探しているものに近いですか?

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なく を使用している限り、完全な型情報があり、個々の列挙値を区別できます。intenum

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 に答える