2017-02-20 11 views
-1

Я пытаюсь вызвать определенный метод (например, метод «Настроение»), связанный с значением Enum (например, Enum WorkDay: понедельник, вторник, среда и т. Д.).
Я, очевидно, могу сделать случай выбора и вызывать определенные методы, как показано ниже.Enum's and Interfaces

Public Enum WorkDay 
    Monday 
    Tuesday 
    Wednesday 
    Thursday 
    Friday 
End Enum 

Dim CurrentDay As Class1.WorkDay = Class1.WorkDay.Monday 
    Select Case CurrentDay 
     Case Class1.WorkDay.Monday 
      Function_Monday() 
     Case Class1.WorkDay.Tuesday 
      Method_Tuesday() 
     Case Class1.WorkDay.Wednesday 
      Method_Wednesday() 
     Case Class1.WorkDay.Thursday 
      Method_Thursday() 
     Case Class1.WorkDay.Friday 
      Method_Friday() 
    End Select 

Однако, я видел, как это делалось раньше, используя интерфейс для Enum для вызова методов в различных классах. Это означает, что он масштабируется, просто добавив новый класс для более новых типов Enum и, следовательно, не нужно добавлять дополнительные ноги Case для новых типов Enum (например, в субботу и воскресенье). Может ли кто-нибудь дать мне код шаблона для этого интерфейса Enum, так как я просто не могу его воссоздать. Я что-то упускаю!

+1

Почему ваш метод 'Method' не принимает' WorkDay' в качестве аргумента? Тогда вам нужен только один метод и один вызов. Замечание: уже существует ['DayOfWeek'-enum] (https://msdn.microsoft.com/en-us/library/system.dayofweek (v = vs.110) .aspx), и вы получаете текущую с ['DateTime.DayOfWeek'] (https://msdn.microsoft.com/en-us/library/system.datetime.dayofweek (v = vs.110) .aspx):' Dim dow = Date.Today.DayOfWeek ' –

+1

Вы знаете, что вы видели это в .net?в java перечисление может иметь методы, а методы enum-s могут реализовать интерфейс. – k3b

+0

Похоже, вы ищете перечисление классов? И вы хотели бы, чтобы эти классы реализовали определенный интерфейс, чтобы вы могли вызвать Class1.WorkDay.GetMood()? Я не видел ничего подобного в .Net. Возможно, вы видели что-то подобное, используя атрибуты? http://stackoverflow.com/questions/25323406/calling-a-method-by-enum-attribute-in-c-sharp –

ответ

0

Разве вам не удастся передать перечисление на ваш метод? И на основе этой логики?

Некоторые вещи, как следующий

Function ProcessDay(DayOfWeek as WorkDay) As IWorkDay 

    Select Case DayOfWeek 
     Case WorkDay.Monday 
      Return <<class that inherits IWorkDay>> 

     Case WorkDay.Tuesday 
      Return <<class that inherits IWorkDay>> 


    End Select 

End Function 
1

Это легко обрабатывается с помощью Pattern типизированного Enum, эту статью (и предыдущий, связанный с ним) дают хороший обзор.

Enhancing the Typesafe Enum Pattern

Вот пример того, как ваш конкретный вопрос может быть обработан этой модели (в пересчете на VB .NET):

Public Class WorkDay 
    ' private constructor 

    Private Sub New(day As String) 
     Me.Day = day 
    End Sub 

    Public Day As WorkDay 

    Public Sub DoDayJob() 
    ' do whatever need done for that day of the week 
    End Sub 

    Public Shared Monday As New WorkDay("Monday") 
    Public Shared Tuesday As New WorkDay("Tuesday") 
    Public Shared Wednesday As New WorkDay("Wednesday") 
    Public Shared Thursday As New WorkDay("Thursday") 
    Public Shared Friday As New WorkDay("Friday") 
End Class 

'used like this (to assign the 'Monday' value) 
Dim day = Workday.Monday 

Я добавил один метод, однако класс может быть как это необходимо.

+1

Спасибо Алекс. Я был немного смущен, когда тег C# был удален, когда я набрал ответ. –

0

Это похоже на работу для меня - Вместо того чтобы использовать Select Case заявление, в этом цикле перебирает Enum значения и сравнивает его с Enum переменных и выполняет метод с соответствующим именем, которое совпадает с именем Enum

For Each day As class1.WorkDay In System.Enum.GetValues(GetType(class1.WorkDay)) 
     If CurrentDay = day Then 
      CallByName(Me, "Method_" & [Enum].GetName(GetType(class1.WorkDay), day), CallType.Method, Nothing) 
     End If 
    Next 

Возможно, вам придется изменить несколько вещей в зависимости от того, как написан ваш код, но основная идея есть.

0

Основываясь на описании ваших целей учета будущих значений и/или классов Enum, простым решением является использование словаря делегата, основанного на базовом типе Enum.

Предположим объявление класса, как это:

Public Class Class1 
    Public Enum WorkDay 
     Monday 
     Tuesday 
     Wednesday 
     Thursday 
     Friday 
    End Enum 

    Public Shared Sub Method_Monday() 
    End Sub 
    Public Shared Sub Method_Tuesday() 
    End Sub 
    Public Shared Sub Method_Wednesday() 
    End Sub 
    Public Shared Sub Method_Thursday() 
    End Sub 
    Public Shared Sub Method_Friday() 
    End Sub 
End Class 

Public Class Class2 
    Public Enum NotWorkDay 
     Saturday 
     Sunday 
    End Enum 
    Public Shared Sub Method_Saturday() 
    End Sub 
    Public Shared Sub Method_Sunday() 
    End Sub 
End Class 

Тогда класс (WinForm в данном случае), который использует описанные выше классы, будет выглядеть примерно так:

Public Class Form1 

    ' declare the delegate dictionary 
    Private WorkMethods As New Dictionary(Of [Enum], Action) 

    Public Sub New() 
     InitializeComponent() 
     SetWorkMethods() 
    End Sub 

    Private Sub SetWorkMethods() 
     'fill the dictionary with the needed actions 
     WorkMethods.Add(Class1.WorkDay.Monday, New Action(AddressOf Class1.Method_Monday)) 
     WorkMethods.Add(Class1.WorkDay.Tuesday, New Action(AddressOf Class1.Method_Tuesday)) 
     WorkMethods.Add(Class1.WorkDay.Wednesday, New Action(AddressOf Class1.Method_Wednesday)) 
     WorkMethods.Add(Class1.WorkDay.Thursday, New Action(AddressOf Class1.Method_Thursday)) 
     WorkMethods.Add(Class1.WorkDay.Friday, New Action(AddressOf Class1.Method_Friday)) 
     WorkMethods.Add(Class2.NotWorkDay.Saturday, New Action(AddressOf Class2.Method_Saturday)) 
     WorkMethods.Add(Class2.NotWorkDay.Sunday, New Action(AddressOf Class2.Method_Sunday)) 
    End Sub 

    ' a helper method to retrieve and execute the action 
    Private Sub DoWork(day As [Enum]) 
     Dim actionToPerform As Action = Nothing 
     If WorkMethods.TryGetValue(day, actionToPerform) Then 
      If actionToPerform IsNot Nothing Then actionToPerform() 
     End If 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     DoWork(Class1.WorkDay.Wednesday) 
    End Sub 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     DoWork(Class2.NotWorkDay.Saturday) 
    End Sub 
End Class 

Такое использование дает вам большая гибкость при настройке вызванных методов с необходимостью переписать блок Select-Case, когда необходимы изменения. Вы просто добавляете/удаляете элементы в словаре.