接口/基类中的C#枚举?

kae*_*aem 12 c# virtual enums parent

我有枚举的问题

我需要在基类或接口中创建一个枚举(但是空的)

class Base 
{
   public enum Test;
   // ???
}
Run Code Online (Sandbox Code Playgroud)

并在一些父类中创建不同的枚举之后

class Parent1
{
   public enum Test {A, B, C};
}

class Parent2
{
   public enum Test {J, H, K};
}
Run Code Online (Sandbox Code Playgroud)

现在,当我必须使用枚举时,我有下一节课的方法

class Test<T>
{
   public void Foo(Test enum)
   {
      int value = (int) enum;
      // ...
   }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做那样的事情?

如果不是,我必须在每个班级使用静态内联...

class Parent1
{
   public static int A = 0;
   public static int B = 5;
   public static int C = 7;
}

class Parent2
{
   public static int J = 1;
   public static int H = 3;
   public static int K = 6;
}

class Test<T>
{
   public void Foo(int enum)
   {
      int value = enum;
      // ...
   }
}
Run Code Online (Sandbox Code Playgroud)

我在代码中看起来不好......在某些类中我必须使用~20 +变量

小智 27

令人惊讶的是,我经常发现人们争论为什么需要某些东西,而不是回答所提出的问题或保持问题 - 其中任何一个都比浪费时间质疑为什么特定的调查优先于受访者的不同调查更有帮助.实际上知道答案.回答没有被问过的问题绝对没有帮助,伙计们好吗?!

回到手头的主题,我今天早上完全按照上面的场景,并且能够理解为什么能够在接口或基类中定义Enum,然后重新定义同名的Enum是有用的.在从基类或接口派生的类中.这种设计的一个用途是对象关系映射和控制绑定.您可能有一组枚举,用于描述派生类的哪些属性可绑定到哪些类型的Control,例如:

    public enum WebControlTextBoxProperties { }

    public enum WebControlLabelProperties { }
Run Code Online (Sandbox Code Playgroud)

...等等.

由于在相关继承生效之前您不确切知道给定派生类将存在哪些属性,但由于您可能还希望在基础或接口中使用一致的方法来使用上述枚举,因此它是完全有效的设计期望能够定义Enum 将存在于基础/接口中,但确切地定义它在任何派生类中的特定上下文中具有哪些成员.

我真的希望这在C#中是可行的,因为它在VB中,因为它是一个非常有用的功能.

  • 对我来说,问为什么需要什么东西是一种要求更多信息的方式.问题的答案经常是"这是不可能的".但通过找出为什么需要解决方案可以提供额外的选择或方向. (2认同)

Mar*_*ell 25

没有抽象枚举(在子类中可以有不同的实现) - 但泛型可能是一个选项:

class Base<T> where T : struct {
    private T value;
    public void Foo(T value) {
        this.value = value;
    }
}
class Parent1 : Base<Parent1.Enum1> {
    public enum Enum1 {A, B, C};
}
class Parent2 : Base<Parent2.Enum2> {
    public enum Enum2 { J, H, K };
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,这并不强制只有枚举可用 - 你可以在运行时执行此操作 - 例如在类型初始值设定项中:

static Base() {
    if (!typeof(T).IsEnum) throw new InvalidOperationException(
         typeof(T).Name + " is not an enum");
}
Run Code Online (Sandbox Code Playgroud)