2015-12-21 2 views
2

Предположим, что у меня есть два перечислений следующие:Могу ли я создать интерфейс для перечислений в C#

namespace A 
{ 
    public enum AE 
    { 
     AE_0, 
     AE_1 
    } 
} 

namespace B 
{ 
    public enum BE 
    { 
     BE_0, 
     BE_1 
    } 
} 

Я хотел бы использовать эти два перечислений выглядит как один, так что, в функции, мы можем использовать как F (AE) и F (BE) без определения двух функций.

Насколько я знаю, мы можем создать интерфейс для двух разных классов, чтобы при назначении интерфейса в качестве параметра эти два класса могли использоваться.

Могу ли я сделать то же самое для перечисления?

спасибо.

Edit: Я поднимаю эту проблему, потому что у меня уже есть перечислимую А в пространстве имен А. Теперь я хотел бы добавить перечислимую B в пространстве имен B, не касаясь ничего в пространстве имен А. Однако, в пространстве имен А, у меня уже есть функция F с перечислением A в качестве параметра. Теперь я хотел бы использовать функцию F с enum B в пространстве имен B. Я получил ошибку, потому что перечисление A и перечисление B не могут преобразовываться друг в друга. Спасибо.

+0

Вы либо хотите создать функцию, которая принимает общий тип, либо просто воспользоваться тем фактом, что перечисления являются просто 'int' по умолчанию. В любом случае, интерфейс здесь не нужен. –

+1

Согласитесь с Lynn, используя generics, может просто работать здесь и добавить ограничение 'where T: struct'. Например: 'void F (T input), где T: struct {...}' – DavidG

+1

Если перечисления взаимозаменяемы, должны ли они быть действительно переписными? – Rob

ответ

3

Нет, вы не можете, потому что enum наследует от System.Enum и ничего более.

Кроме того, несмотря на очевидные появлений, применяя интерфейс для перечисления бы не дают желаемых результатов, поскольку члены перечислений реализованы в виде static значений, и interface не может указать static значения.

Наконец, если у вас есть что-то, что действительно нужно принимать два вида enum параметров, рассмотреть, должны ли они быть два отдельных enum s, или один enum с [Flags].

+2

'enum' не наследуется от' System.Enum', 'enum' * is * a' System.Enum' – DavidG

+0

@DavidG Не в соответствии с ILDasm. 'enum MyEnum' становится' .class private auto ansi sealed MyEnum extends [mscorlib] System.Enum' – David

+0

@DavidG, он печально «enum наследует ...», а не «Enum наследует ...». Акцент на «an «. – adv12

0

Как и многие другие, лучше всего использовать общий метод, поскольку C# не позволяет создавать интерфейс для перечисления. Я создал быстрый образец, который позволяет вам передавать члены из разных перечислений.

namespace A 
{ 
    public enum AE 
    { 
     AE_0, 
     AE_1 
    } 

    public class DoSomething 
    { 
     public static void F<T>(T enumMember) where T : struct 
     { 
      // exit early if something other than enum entered 
      if (!typeof(T).IsEnum) 
      { 
       throw new ArgumentException("T is not enum"); 
      } 

      // Do whatever you need to do here 
      Console.WriteLine(enumMember.ToString()); 
     } 
    } 
} 

namespace B 
{ 
    public enum BE 
    { 
     BE_0, 
     BE_1 
    } 
} 

namespace C 
{ 
    public class Class1 
    { 
     public static void processEnum() 
     { 
      A.DoSomething.F<A.AE>(A.AE.AE_0); 
      A.DoSomething.F<B.BE>(B.BE.BE_0); 
     } 
    } 
} 
Смежные вопросы