Property.GetValue - Тест для нулевых разрывов с внутренним исключением нулевой ссылки? - PullRequest
0 голосов
/ 11 мая 2018

Мне нужно отсканировать кучу файлов Outlook .msg, и я использую для этого библиотеку MsgReader. (проект библиотеки MsgReader на Github) Я написал следующий метод, который открывает сообщение, просматривает каждое из свойств и извлекает любые из тех, которые помечены как «строка», для добавления в словарь для возвратадля звонящего.Вот код:

    public Dictionary<string, string> GetMsgFileDetails(string filepath)
    {
        Dictionary<string, string> filedetails = new Dictionary<string, string>();
        //try
        {
            string fullpath = Path.Combine(SelectedFolder, filepath);
            var msg = new Storage.Message(fullpath);
            foreach (var prop in msg.GetType().GetProperties())
            {
                string pname = prop.Name;

                if (prop.GetValue(msg) != null)
                {
                    object pvalue = prop.GetValue(msg);
                }
                // We only want the strings
                if (prop.GetValue(msg) != null && (prop.GetValue(msg) is string))
                {
                    filedetails.Add(prop.Name, prop.GetValue(msg).ToString());
                }

            }
            return filedetails;
        }
        //catch (Exception ex)
        //{
        //    MessageBox.Show(ex.Message, "Error trying to load file");
        //    return null;
        //}
    }

 (the try-catch block is commented out to allow easier debugging).

Кажется, что все работает просто отлично, но оно достигает одного из значений, что приводит к разрыву строки

   (prop.GetValue(msg) != null)

с System Reflection TargetInvocationException.Подробности исключений следующие:


C:\Users\Brett\source\repos\FileMunger\FileMunger\ViewModels\FolderContext.cs:line 208
at FileThing.ViewModels.FolderContext.GetProperties(String filepath, Boolean showwindow) in C:\Users\Brett\source\repos\FileMunger\FileMunger\ViewModels\FolderContext.cs:line 159
at FileMunger.MainWindow.FileList_Selected(Object sender, RoutedEventArgs e) in C:\Users\Brett\source\repos\FileMunger\FileMunger\MainWindow.xaml.cs:line 121
at system.Windows.Controls.SelectionChangedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
at System.Windows.Controls.ListBox.OnSelectionChanged(SelectionChangedEventArgs e)
at System.Windows.Controls.Primitives.Selector.InvokeSelectionChanged(List`1 unselectedInfos, List`1 selectedInfos)
at System.Windows.Controls.Primitives.Selector.SelectionChanger.End()
at System.Windows.Controls.Primitives.Selector.SelectionChanger.SelectJustThisItem(ItemInfo info, Boolean assumeInItemsCollection)
at System.Windows.Controls.ListBox.MakeSingleSelection(ListBoxItem listItem)
at System.Windows.Controls.ListBox.NotifyListItemClicked(ListBoxItem item, MouseButton mouseButton)
at System.Windows.Controls.ListBoxItem.HandleMouseButtonDown(MouseButton mouseButton)
at System.Windows.Controls.ListBoxItem.OnMouseLeftButtonDown(MouseButtonEventArgs e)
at System.Windows.UIElement.OnMouseLeftButtonDownThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
at System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()
at FileMunger.App.Main()

Inner Exception 1:
 NullReferenceException: Object reference not set to an instance of an object.

Похоже, это связано с тем, что значение prop.GetValue равно null, но я пытаюсь это проверить.Я понимаю, что это может оказаться в глубине размышлений, когда я не являюсь экспертом, поэтому, если у кого-то есть какие-либо идеи, как сделать эту проверку, я действительно ценю это.Приветствия.

1 Ответ

0 голосов
/ 12 мая 2018

Я отмечаю это как ответ на случай, если кто-то еще столкнется с той же проблемой.В библиотеке MsgReader действительно есть ошибка.Я поднял проблему там, и есть несколько обходных путей, которые были очень любезно предоставлены.Команда также собирается это исправить, так что, надеюсь, это будет недолгим. Вы можете увидеть тему Github здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...