如何在枚举中创建逻辑

时间:2012-10-01 09:57:40

标签: c# enums

在C#中我知道我们不能将对象分配给Enum。我所追求的功能是在声明Enum时触发事件。

所以没有

enum MyEnum
{
  string, int, etc
}

我可以

enum MyEnum
{
    classType1, classType2
}

这将允许调用类classType1 / classType2构造函数,这可以(例如)在声明枚举时用于记录。

提出问题的另一种方式可能是

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

有解决方法吗?

6 个答案:

答案 0 :(得分:1)

您可以将enum与静态属性一起使用,而不是static class,它可以与enum一样使用,但您可以在getter和setter中编写代码。

答案 1 :(得分:1)

U可以使用properties代替enum(然后你可以编写你自己的逻辑,这将在分配变量之后/之前调用)。 enum结构应该用于创建类似标志的东西。

private string _myVar;
public string MyVar
{
   get { return _myVar; }
   set
   {
      // logic 1 here
      _myVar = value;
      // logic 2 here
   }
}

答案 2 :(得分:1)

我认为没有解决方法,你的期望与语言不符。例如,考虑一下会发生什么:

if (myEnumValue == MyEnum.classType1)

你的问题意味着在右边会为等式测试实例化一个'classType1'类,然后结果将依赖于那些类型的相等实现。当左边的项目是枚举时,这会令人困惑......但是假设它是'classType1'类型的对象,这意味着左边和右边都是临时对象。

你可以看到这不起作用。

但是......我认为你真正想要的是一个从枚举中创建对象的工厂。提出其他问题的其他问题(对不起)。像这样的枚举意味着一个状态......所以如果你有一个状态,为什么这个状态需要一个枚举?这是一个很大的问题,请查看状态模式。

希望我帮助过。

答案 3 :(得分:1)

枚举是基于Int##类型的值类型。所以这与询问相同:我可以在int i = 7;的分配中得到一些逻辑,而直接答案是否是。

除了整数类型之外,你不能将enum基于任何其他类型。

但您的要求似乎与跟踪实例有关。这很容易与属性。但是您只能为特定属性执行此操作,而不是将其构建到Type中。

答案 4 :(得分:1)

Enums几乎没有带有全面标签的整数。据我所知,你要找的东西不能用枚举来完成。

然而,正如@ 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;
...

答案 5 :(得分: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所固有的实现(即参考质量)对其进行准确测试。