0

C#では、オブジェクトを列挙型に割り当てることはできません。私が求めている機能は、列挙型が宣言されたときに、イベントをトリガーすることです。

だから持っている代わりに

enum MyEnum
{
  string, int, etc
}

ができた

enum MyEnum
{
    classType1, classType2
}

これにより、クラスclassType1 / classType2コンストラクターを呼び出すこともできます。これは、(たとえば)列挙型が宣言されたときのログ記録に役立ちます。

私の問題を提示する別の方法は

enum MyEnum
{
   string1
      {
          //logic
      },
   string2
      {
          //logic
      }
}

これに対する回避策はありますか?

4

6 に答える 6

1

Uはproperties代わりに使用できますenum(その後、変数の割り当て後/前に呼び出される独自のロジックを記述できます)。このenum構造は、フラグのようなものを作成するために使用する必要があります。

private string _myVar;
public string MyVar
{
   get { return _myVar; }
   set
   {
      // logic 1 here
      _myVar = value;
      // logic 2 here
   }
}
于 2012-10-01T10:03:09.833 に答える
1

enum静的プロパティでを使用する代わりに、static classと同じように使用できますenumが、getterおよびsetter内にコードを記述できます。

于 2012-10-01T10:02:08.330 に答える
1

あなたの期待が言語と一致しないので、回避策はありません。たとえば、次の場合に何が起こるかを考えてみましょう。

if (myEnumValue == MyEnum.classType1)

あなたの質問は、右側で「classType1」のクラスが同等性テストのためにインスタンス化され、結果が同等性のそのタイプの実装に依存することを意味します。左側のアイテムが列挙型の場合、これは混乱を招きます...しかし、あなたの仮定では、これはタイプ'classType1'のオブジェクトであり、これは、左側と右側の両方が一時的なオブジェクトであることを意味します。

これが機能しなかったことがわかります。

しかし...私が本当に求めているのは、列挙型からオブジェクトを作成するためのファクトリです。他の質問を提起した他のすべての質問(申し訳ありません)。このような列挙型は状態を意味します...それで、あなたが状態を持っているなら、なぜその状態は列挙型を必要とするのですか?それ自体が大きな問題です。状態パターンを確認してください。

私が助けてくれたことを願っています。

于 2012-10-01T10:05:22.237 に答える
1

列挙型は、型に基づく値型Int##です。したがって、これは質問と同じです。割り当てにロジックを組み込むことができますかint i = 7;。直接の答えは「いいえ」です。

enumまた、整数型以外のものに基づくこともできません。

しかし、あなたの要件はインスタンスの追跡にあるようです。プロパティを使えば簡単です。ただし、特定のプロパティに対してのみ実行でき、Typeに組み込むことはできません。

于 2012-10-01T10:06:24.187 に答える
1

列挙型は、包括的なラベルを持つかろうじて整数です。私の知る限り、列挙型を使用して探していることを行うことはできません。

ただし、@ Grumbler85で述べられているように、この動作はファクトリを使用してシミュレートできます。ファクトリは、他のオブジェクトのインスタンスを作成するために使用される特殊なタイプのオブジェクトです。

ファクトリを実装する最も簡単な方法はswitchステートメントを使用することですが、他の方法もあります(たとえば、リフレクション)。これがあなたが探しているものの簡単な例です:

Class A
{
   ...
}

Class B
{
   ... 
}

enum eKnownTypes
{
     A,
     B
}

Class Factory
{
    /* 
         Implement Singleton here
         ....
    */
    public object CreateInstance(eKnownTypes t)
    {
         /*
               Raise any event needed here
               ...
         */
         switch (t):
         {
              case eKnownTypes.A: return new A(); break;
              case eKnownTypes.B: return new B(); break;
         }          
         return null;
    }

}

/* 
         Set Event Handlers here
         Factory.Instance.CustomEvent += new EventHandler ... 
         ....
*/
A objectA = Factory.Instance.CreateInstance(eKnownTypes.A) as A;
...
于 2012-10-01T10:10:19.990 に答える
1

列挙型で実行できますが、実行できます

public struct MyType
{
    public const int OneValue = 1;
    public const int TwoValue = 2;

    private static readonly MyType one = new MyType(OneValue);
    private static readonly MyType two = new MyType(TwoValue); 

    private readonly value int;

    private MyType(int value)
    {
        this.value = value;
    }

    public static One
    {
        get { return this.one; }
    }

    public static Two
    {
        get { return this.two; }
    }

    public static implicit operator int(MyType source)
    {
        return source.value;
    }
}

列挙型のように動作するが完全に拡張可能なクラスを提供します。

たとえば、あなたはすることができます

var myType = MyType.One;

switch (myType)
{
   case MyType.OneValue:
       ...

   case MyType.TwoValue:
       ...

   default:
       ...
}

インスタンスは不変であり、から継承された実装object、つまり参照品質を使用して、同等性を正確にテストできます。

于 2012-10-01T10:13:02.463 に答える