определяющая функция по отдельным константам перечисления - PullRequest
0 голосов
/ 15 сентября 2011

один из моих классов имеет enum в качестве одного из своих свойств, и определение класса выглядит следующим образом:

public class A
{

    string properrty1;
    int id;
    CustomEnum enum;

    public A()
    {
      //initialize the properties

    }

}

Таким образом, основываясь на типе перечисления, класс мне нужен для вызова функции, котораяполучит доступ к некоторым свойствам класса и выполнит с ним действия.

Каков наилучший подход для этого?

Я думал о том, чтобы иметь интерфейс как одно из свойствclass, а затем создать экземпляр интерфейса в конструкторе класса на основе перечисления, и при необходимости я могу сделать classObject.interface.interfaceImplementation ();

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

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Прежде всего, что не так с switch утверждениями?Если все, что вы делаете, это вызываете функцию a , просто вставьте туда switch и вызовите ее соответствующим образом - нет необходимости в интерфейсах или чем-то еще.Не переусердствуйте в этом.

Теперь, если у вас есть веские причины не использовать этот подход, другой альтернативой для переключения является Dictionary<CustomEnum, T>, где T - это то, что вам нужно.

2 голосов
/ 15 сентября 2011

Один вариант будет иметь Dictionary<CustomEnum, Action>:

private static readonly Dictionary<CustomEnum, Action<A>> Actions =
{
    { CustomEnum.Foo, FooAction },
    { CustomEnum.Bar, BarAction },
    { CustomEnum.Baz, BazAction },
};

private static void FooAction(A a) { ... }
private static void BarAction(A a) { ... }
private static void BazAction(A a) { ... }

public void DoSomething()
{
    Actions[enumValue](this);
}

Это действительно зависит от того, для чего предназначены эти функции и т. Д. Если действие действительно присуще самому перечислению, вы можете создать «умное перечисление», которое в основном представляет собой фиксированный набор значений, но это класс с поведением. Это немного похоже на перечисление Java, но C # как язык не имеет большой поддержки.

См. DateTimeFieldType в Noda Time для примера этого. У него есть только свойства, он может легко иметь методы, и они могут быть абстрактными с конкретными вложенными в них частными подклассами - немного похоже на ZoneLocalMapping, также во Noda Time - но в в этом случае это фабрика с тремя различными реализациями вместо трех конкретных значений.

...