Как представить Enum в интерфейсе, когда вы не можете - PullRequest
25 голосов
/ 10 июля 2010

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

Итак, как вы справляетесь с этим?эта ситуация?Как вы все еще можете получить этот метод в вашем интерфейсе.Вы не знаете, какой Enum им потребуется для отправки, но вы точно знаете, что хотите, чтобы это был enum вместо магических строк.

Enum не является ссылочным типом, поэтому вы не можетеиспользуйте Object в качестве типа для входящего параметра.Так что не уверен, что тут делать.

Ответы [ 5 ]

30 голосов
/ 10 июля 2010
public enum MyEnum
{
  Hurr,
  Durr
}

public interface MyInterface
{
  void MyMethod(MyEnum value);
}

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

16 голосов
/ 10 июля 2010
interface MyInterface
{
    void MyMethod(Enum @enum);
}
2 голосов
/ 13 ноября 2018

Другим решением может быть использование универсальных типов:

public enum MyEnum
{
    Foo,
    Bar
}

public interface IDummy<EnumType>
{
    void OneMethod(EnumType enumVar);
}

public class Dummy : IDummy<MyEnum>
{
    public void OneMethod(MyEnum enumVar)
    {
        // Your code
    }
}

Кроме того, начиная с C # 7.3, вы можете добавить общее ограничение для приема только типов Enum:

public interface IDummy<EnumType> : where EnumType : Enum
{
    void OneMethod(EnumType enumVar);
}
0 голосов
/ 06 сентября 2017

Определение перечисления похоже на определение класса или определение интерфейса. Вы можете просто поместить его в один из ваших файлов классов, внутри пространства имен, но вне определения класса, но если его используют несколько классов, в какой из них вы его вставите, и какой бы вы ни выбрали, вы получите «Имя типа не соответствует файлу Назовите «предупреждения». Таким образом, «правильный» способ сделать это - поместить его в отдельный файл, как если бы вы использовали класс или интерфейс:

MyEnum.cs

namespace MyNamespace { internal enum MyEnum { Value1, Value2, Value3, Value4, Value5 }; } Тогда любые интерфейсы или классы в пространстве имен могут получить к нему доступ.

0 голосов
/ 10 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...