Преобразовать System.DayOfWeek в Microsoft.Офис.Взаимодействие.Outlook.OlDaysOfWeek

#c# #outlook-api

#c# #outlook-api

Вопрос:

Есть ли возможность напрямую преобразовать значение System .DayOfWeek в значение Microsoft.Офис.Взаимодействие.Outlook.OlDaysOfWeek. Что-то вроде:

 var day = DayOfWeek.Friday;
OlDaysOfWeek days = ConvertToDaysOfWeek(day);
 

Комментарии:

1. Прямого преобразования нет, но вы можете написать его, возможно, используя switch оператор.

2. Из ваших ссылок похоже, что целочисленные значения за перечислениями разные. Я бы написал свой собственный метод преобразования.

Ответ №1:

Чтобы сделать это без использования манипуляций со строками, вот вариант:

 public OlDaysOfWeek ConvertToDaysOfWeek(DayOfWeek day)
{
    return (OlDaysOfWeek)Math.Pow(2, (int)day); 
}
 

Комментарии:

1. Это самая краткая форма преобразования, хороший вызов o Math.Pow

Ответ №2:

Вы можете попробовать это:

 var olDay = (OlDaysOfWeek) Enum.Parse(typeof(OlDaysOfWeek), $"ol{systemDay}");
 

Комментарии:

1. Умный. Бонусные баллы, если вы обернете его в методы расширений для преобразования в обоих направлениях.

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

3. @DavidG Я тоже сначала подумал то же самое, но он уже проходит через уровень com-взаимодействия. Я сомневаюсь, что манипулирование строками — это бутылочное горлышко.

4. Дополнительное примечание: вам не нужно вызывать ToString() объекты, встроенные в интерполяцию строк. Это неявно.

5. @DavidG преобразование по значению менее безопасно

Ответ №3:

Простая инструкция switch, вероятно, будет наиболее производительной:

 public OlDaysOfWeek ConvertToDaysOfWeek(DayOfWeek day)
{
  switch (day)
  {
    case DayOfWeek.Monday: return OlDaysOfWeek.olMonday;
    case DayOfWeek.Tuesday: return OlDaysOfWeek.olTuesday;
    case DayOfWeek.Wednesday: return OlDaysOfWeek.olWednesday;
    case DayOfWeek.Thursday: return OlDaysOfWeek.olThursday;
    case DayOfWeek.Friday: return OlDaysOfWeek.olFriday;
    case DayOfWeek.Saturday: return OlDaysOfWeek.olSaturday;
    case DayOfWeek.Sunday: return OlDaysOfWeek.olSunday;
    default: throw new ArgumentOutOfRangeException("What day is this?", "day");
  }
}
 

В качестве альтернативы, вы, вероятно, могли бы проанализировать значение и вернуть сопоставленное значение на основе имени перечисляемого значения.

 public OlDaysOfWeek ConvertToDaysOfWeek(DayOfWeek day)
{
  return (OlDaysOfWeek) Enum.Parse(typeof(OlDaysOfWeek), "ol"   day.ToString());
}
 

В OlDaysOfWeek перечислении используется последовательность степеней 2, которая обычно используется при объединении значений в виде побитовых флагов. DaysOfWeek имеет простую линейную последовательность, отраженную как 0-6 — вот почему вы не можете сравнивать, используя базовое int значение

Комментарии:

1. Не совсем верно в вашем последнем абзаце, оба перечисления используют воскресенье в качестве первого дня.

Ответ №4:

Наконец я нашел следующее решение. Спасибо за подсказки.

 public static OlDaysOfWeek AsDaysOfWeek(this DayOfWeek dayOfWeek)
{
    return (OlDaysOfWeek)(1 << (int)dayOfWeek);
}
 

Для использования следующим образом:

 var day = DayOfWeek.Friday;
OlDaysOfWeek days = day.AsDaysOfWeek();
 

Кроме того, это модульные тесты в NUnit для метода:

 [TestCase(DayOfWeek.Monday, OlDaysOfWeek.olMonday)]
[TestCase(DayOfWeek.Tuesday, OlDaysOfWeek.olTuesday)]
[TestCase(DayOfWeek.Wednesday, OlDaysOfWeek.olWednesday)]
[TestCase(DayOfWeek.Thursday, OlDaysOfWeek.olThursday)]
[TestCase(DayOfWeek.Friday, OlDaysOfWeek.olFriday)]
[TestCase(DayOfWeek.Saturday, OlDaysOfWeek.olSaturday)]
[TestCase(DayOfWeek.Sunday, OlDaysOfWeek.olSunday)]
public void AsDaysOfWeek(DayOfWeek dayOfWeek, OlDaysOfWeek expectedResult)
{
    var result = dayOfWeek.AsDaysOfWeek();

    Assert.That(result, Is.EqualTo(expectedResult));
}
 

Комментарии:

1. Вы нашли этот ответ в Интернете?

2. Обратите внимание, что у вас возникнут проблемы, если какой-либо из параметров перечисления изменит значение.

3. «Кроме того, это модульные тесты» — вы забыли тесты для значений перечисления вне диапазона 🙂

4. @StanislavMolchanovsky Если Microsoft изменит значения перечисления, наиболее вероятным результатом будет то, что у каждой программы, использующей Outlook interop, будут проблемы. Это было бы изменением общедоступного интерфейса. Это не то, что MS делает легко.

5. @BradleyUffner вы правы, это маловероятно. Но при выборе решения необходимо учитывать все его плюсы и минусы 🙂