Создание динамической перегрузки метода на основе указанного значения перечисления - PullRequest
0 голосов
/ 04 мая 2019

Я хочу создать перегрузку метода на основе указанного enum-значения.

У меня есть следующий метод-конструкция:

public void InsertValue(DataType dataType, ... special values ...) {
   // Do something... 
}

DataType - это перечисление с некоторыми значениями, такими как:

  • время
  • дата
  • Дата и время
  • base64
  • 1017 * URI *

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

InsertValue(DataType.datetime, DateTime date, int parent_id, bool absolute_value);

Я хочу определить это для каждого значения в перечислении. Есть ли в C # функциональность для выполнения чего-то подобного?

Спасибо всем, кто может помочь!

1 Ответ

0 голосов
/ 04 мая 2019

Возможно, я неправильно понимаю ваш вопрос;но вы можете подключить что-то вроде этого:

public class MyClass {
   private Dictionary<DataType, Action<object[]>> dispatcher;
   public MyClass() {
    dispatcher = new Dictionary<DataType, Action<object[]>>();
    dispatcher.Add(DataType.dateTime, InsertDateTime);
    dispatcher.Add(DataType.time, InsertTime);
    ...
    }
   //your "overload" of what to do with dateTime
   private void InsertDateTime(object[] specialValues) {
      var date = (DateTime)specialValues[0]; //assume the first param is DateTime;
      var parentId = (int)specialValues[1]; //assume the 2nd param is an int, 
      ...etc
   }
   //your "overload" for what to do with time
   private void InsertTime(object[] specialValues) {
      //do whatever special values you expect for DateType.time
   }      
   public void InsertValue(DataType dataType, params object[] specialValues) {
      //this function will cause the appropriate dataType specific Insert method to be called
      dispatcher[dataType].Invoke(specialValues);
   }
}

Это было бы чище, если бы вы знали, что сигнатура метода для каждого типа одинакова, но при условии, что ваши "специальные значения" были уникальной сигнатурой для каждого типа,Я использовал Action<object[]>, но вы могли бы использовать Action<object, int, int> или все, что вам нужно, чтобы получить более приятные сигнатуры методов.

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

...