C# Property.GetValue-测试是否存在空引用内部异常的空中断?
我需要扫描一堆Outlook“.msg”文件,我正在使用MsgReader库进行扫描。 我编写了下面的方法,它打开消息,读取每个属性,并提取标记为“string”的任何属性,将其添加到字典中以返回给调用方。 代码如下:C# Property.GetValue-测试是否存在空引用内部异常的空中断?,c#,.net,wpf,windows,reflection,C#,.net,Wpf,Windows,Reflection,我需要扫描一堆Outlook“.msg”文件,我正在使用MsgReader库进行扫描。 我编写了下面的方法,它打开消息,读取每个属性,并提取标记为“string”的任何属性,将其添加到字典中以返回给调用方。 代码如下: public Dictionary<string, string> GetMsgFileDetails(string filepath) { Dictionary<string, string> filedetails =
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).
要与系统反射TargetInException断开的行。例外情况详情如下:
这似乎是由于prop.GetValue的值计算为null,但这正是我要测试的。 我意识到这可能是深入思考,我不是一个专家,所以如果有人有任何想法如何做这个检查,我真的很感激。
干杯。我将此标记为一个答案,以防其他人遇到相同的问题。MsgReader库中确实存在一个bug。我已经在那里提出了这个问题,并且已经非常友好地提供了一些解决办法。球队也将修复它,所以这只希望是短暂的 您应该尝试获取InnerException的堆栈跟踪。这很可能是MsgReader中的一个bug。您应该能够通过在获取属性之前记录它获取的属性来测试这一点,然后您可以编写相同的代码而不进行反射以查看发生了什么。如果您只需要字符串属性,那么在知道属性是字符串之前,不要调用
GetValue
。您可以使用prop.PropertyType==typeof(string)
进行检查。好主意,黛西,谢谢。。我确实知道它是哪一个属性,所以我会按照你的建议不加思考地尝试它。谢谢Evk,但碰巧的是,失败的属性类型是字符串。这是MailingListHelp属性。我在foreach语句之前添加了一行:var msgmailhelp=msg.MailingListHelp。它是string类型,如果不存在任何内容,则返回空值。相反,它会因System.NullReferenceException而中断。所以我想我的下一站是GitHub问题部分。。。再次感谢黛西。
(prop.GetValue(msg) != null)
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.