#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 вы правы, это маловероятно. Но при выборе решения необходимо учитывать все его плюсы и минусы 🙂