Реализуйте перечисление в интерфейсе c # и в одной из сигнатур метода интерфейса - PullRequest
7 голосов
/ 19 октября 2010

У меня есть интерфейс

Интерфейс:

interface IThing
{
  Enum MyEnum {get;set;}
  string DoAction(MyEnum enumOptionChosen, string valueToPassIn);
}

Конкретная реализация:

public class Thing : IThing
{
  public enum MyEnum
  {
    FirstOption,
    SecondOption,
    ThirdOption
  }

  string doAction(MyEnum enumOptionChosen, string valueToPassIn)
  {
    switch(enumOptionChosen)
    {
      case MyEnum.FirstOption:
        x();
        break;
      case MyEnum.SecondOption:
        y();
        break;
      case MyEnum.ThirdOption:
        z();
        break;
    }
  }
}

Когда я пытаюсь скомпилировать это, я получаю 'IThing.MyEnum' является 'свойством', но используется как 'тип'. Я что-то упускаю из-за возможности требовать использования Enum в подписи DoAction ().

Спасибо за любую помощь.

Ответы [ 3 ]

16 голосов
/ 19 октября 2010

В вашем интерфейсе MyEnum - это имя переменной, а не тип, поэтому она не будет распознаваться компилятором.Вы должны быть в состоянии использовать Generics, чтобы сделать это.

public interface IThing<T>
{
   T MyEnum { get; set; }
   string doAction(T enumOptionChosen, string valueToPassIn);
}

Тогда вы можете реализовать это так:

public interface IThing<T>
{
    T MyEnum { get; set; }
    string doAction(T enumOptionChosen, string valueToPassIn);
}

public class Something : IThing<Something.SpecialEnum>
{
    public enum SpecialEnum
    {
        Item1,
        Item2,
        Item3
    }

    public SpecialEnum MyEnum { get; set; }

    public string doAction(SpecialEnum enumOptionChosen, string valueToPassIn)
    {
        return "something";
    }
}
3 голосов
/ 19 октября 2010

Во-первых, объявите свой enum вне интерфейса / бетона.

Тогда в вашем интерфейсе:

MyEnum SomeNum {get; set;}

Тогда в вашем классе:

public MyEnum SomeNum 
{
   get
   {
     ...
   }
   set
   {
      ...
   }
}

Ваша основная проблема заключалась в том, что вы пытались объявить тип возврата «Enum» из своего интерфейса, когда вы должны были объявить тип возврата «MyEnum».

Помните, enum - это тип. Вы не можете заставить класс реализовать "тип", только свойства / методы.

При этом я чешу голову, пытаясь понять, что вы пытаетесь сделать.

1 голос
/ 14 июня 2018

Я понимаю, что оригинальный пост очень старый, но это другой подход, который понятен и работает хорошо.Поскольку Enum общедоступен, просто определите его вне конкретного класса и интерфейса.(Я позволил себе переименовать тип enum в TheEnum, чтобы избежать путаницы со свойством MyEnum.)

public enum TheEnum
{
    FirstOption,
    SecondOption,
    ThirdOption
}

Затем укажите его в своем интерфейсе и конкретном классе.

public interface IThing
{
    TheEnum MyEnum { get; set; }
    string DoAction(TheEnum enumOptionChosen, string valueToPassIn);
}

public class Thing : IThing
{
    public TheEnum MyEnum { get; set; }

    public string DoAction(TheEnum enumOptionChosen, string valueToPassIn)
    {
        return "Something";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...