0

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

所以而不是拥有

enum MyEnum
{
  string, int, etc
}

我本可以有

enum MyEnum
{
    classType1, classType2
}

然后,这也将允许调用类 classType1/classType2 构造函数,这可能(例如)对声明枚举时的日志记录很有用。

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

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

有解决办法吗?

4

6 回答 6

1

您可以使用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

枚举是基于类型的值Int##类型。所以这和问是一样的:我能在分配的过程中得到一些逻辑吗?int i = 7;直接的答案是否定的。

你也不能enum基于整数类型以外的任何东西。

但是您的要求似乎是跟踪实例。使用属性很容易。但是您只能针对特定属性执行此操作,而不能将其构建到类型中。

于 2012-10-01T10:06:24.187 回答
1

我认为,您的期望与语言不符,因此无法解决。例如考虑会发生什么:

if (myEnumValue == MyEnum.classType1)

您的问题意味着在右侧将为相等测试实例化一个“classType1”类,然后结果将取决于该类型的相等实现。当左侧的项目是枚举时,这会令人困惑……但是根据您的假设,它是“classType1”类型的对象,这意味着左侧和右侧都是临时对象。

你可以看到这是行不通的。

但是......我认为你真正追求的是一个从枚举创建对象的工厂。引发其他问题的整个其他问题(对不起)。像这样的枚举意味着一个状态......所以如果你有一个状态,为什么那个状态需要一个枚举?本身就是一个大问题,请查看状态模式。

希望我有所帮助。

于 2012-10-01T10:05:22.237 回答
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

除了enum你可以使用static class带有静态属性的 a 之外,它可以和 an 一样使用,enum但你可以在 getter 和 setter 中编写代码。

于 2012-10-01T10:02:08.330 回答
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 回答