反射访问List<TabViewItem>索引属性报错,如何获取首个项的HeaderText?
解决List获取第一个Tab的HeaderText问题
错误原因
你用GetType().GetProperty("[0]")获取索引器的方式是错误的,List<T>的索引器对应的属性名称是Item,而非[0],所以这个调用会返回null,后续调用GetValue自然会抛出空引用异常。
推荐解决方案:直接强转(无需反射)
既然已经明确tabs是System.Collections.Generic.List<DevExpress.Maui.Controls.TabViewItem>类型,直接强转后用普通索引访问即可,这种方式比反射更高效且不易出错:
private void HeaderWasTapped(object sender, ItemHeaderTappedEventArgs e) { var PanelMap = new Controls.FlexMap(); var items = sender.GetType().GetProperty("Items").GetValue(sender); // 读取私有成员 var tabs = items.GetType() .GetField("tabItems", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(items); // 强转为List<TabViewItem>,直接访问索引0 var tabList = tabs as List<DevExpress.Maui.Controls.TabViewItem>; if (tabList != null && tabList.Count > 0) { var firstTabHeader = tabList[0].HeaderText; // 这里编写你的条件判断逻辑 } }
反射方式(仅当必须使用反射时)
如果因特殊需求必须用反射访问索引器,要通过名称为Item的属性,并传入索引参数:
private void HeaderWasTapped(object sender, ItemHeaderTappedEventArgs e) { var PanelMap = new Controls.FlexMap(); var items = sender.GetType().GetProperty("Items").GetValue(sender); var tabs = items.GetType() .GetField("tabItems", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(items); // 获取List的索引器属性(名称为Item),传入索引0作为参数 var itemProperty = tabs.GetType().GetProperty("Item"); if (itemProperty != null) { var firstTab = itemProperty.GetValue(tabs, new object[] { 0 }); if (firstTab != null) { var headerTextProperty = firstTab.GetType().GetProperty("HeaderText"); if (headerTextProperty != null) { var headerText = headerTextProperty.GetValue(firstTab) as string; // 这里编写你的条件判断逻辑 } } } }
内容的提问来源于stack exchange,提问作者abc123
相关产品推荐
相关产品推荐

