Outlook VSTO - проверка существования свойства перед попыткой получить свойство через PropertyAccessor - PullRequest
0 голосов
/ 17 января 2020

Есть ли способ проверить, существует ли свойство, перед попыткой получить свойство через PropertyAccessor?

Я использую приведенную ниже функцию, используя Outlook PropertyAccessor, чтобы вернуть строковое значение свойства , Если свойство не существует, функция перехватывает ошибку и возвращает строку с нулевым значением. Я записываю ошибку, используя метод debug.writeline, чтобы визуально определить, какая ошибка выдается - единственная ошибка, с которой я действительно сталкиваюсь, это Исключение: 'System.Runtime.InteropServices.COMException , и это обычно связано свойство неизвестно или не может быть найдено. Передаваемый DASL и имена свойств правильны и работают - однако не все электронные письма имеют эти свойства - они создаются независимым поставщиком программного обеспечения.

    ...
    using Outlook = Microsoft.Office.Interop.Outlook;
    ...
    private string GetPropertyString(Outlook.PropertyAccessor pa, string property)
    {
        string retVal = null;

        try
        {
            retVal = (string)pa.GetProperty(property);
        }
        catch (Exception ex)
        {
            retVal = null;
            Debug.WriteLine("OutlookProperties - GetPropertyString() - Error:=" + ex.Message);
            //throw;
        }
        finally
        {

        }
        return retVal;
    }

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

Исключение: «System.Runtime.InteropServices.COMException» в Office777.dll

OutlookProperties - GetPropertyString () - Ошибка: = Свойство "http://schemas.microsoft.com/mapi/string/ {41FFBD02-4241-4EBD-A7B3-93DD2DF86CA9} / CaseGUID" неизвестно или не может быть найдено.

Большое спасибо заранее

1 Ответ

1 голос
/ 17 января 2020

Обработка исключения является единственным способом - старые версии Outlook раньше возвращали значение null, но последние версии всегда выдают исключение. Проверка COMException.ErrorCode также не поможет: обычно это 0x80020009 (DISP_E_EXCEPTION), а не что-то более информативное, например MAPI_E_NOT_FOUND.


...