实现CompositeCollectionConverter后无法访问调试Raw View属性问题
解决CompositeCollectionConverter中无法访问Raw View属性的问题
你遇到的情况是:调试时能在Raw View看到对象的属性,但强转成已知类型后无法访问。这是因为values数组中的对象通常是动态代理、封装类(比如WPF的CollectionView)或匿名类型,这些类型的属性无法通过常规强转直接访问,可通过以下方法处理:
方法1:使用反射获取属性值
反射可以无视编译时类型限制,直接读取对象的属性:
foreach (var item in values) { if (item is IEnumerable enumerableItem && item != null) { // 替换为你需要获取的属性名称 var propertyInfo = item.GetType().GetProperty("TargetPropertyName"); if (propertyInfo != null) { var propertyValue = propertyInfo.GetValue(item); // 此处可对属性值进行业务处理 } res.Add(new CollectionContainer() { Collection = enumerableItem }); } }
方法2:使用dynamic类型(.NET 4.0+)
如果明确知晓属性名称和存在性,可通过dynamic绕过编译时类型检查:
foreach (var item in values) { if (item is IEnumerable enumerableItem && item != null) { dynamic dynamicItem = item; // 直接访问属性,注意属性名称拼写错误会触发运行时异常 var propertyValue = dynamicItem.TargetPropertyName; res.Add(new CollectionContainer() { Collection = enumerableItem }); } }
方法3:针对WPF绑定包装对象的特殊处理
如果values中的对象是WPF的ICollectionView(如ListCollectionView),它的原始集合和视图属性需通过特定成员访问:
foreach (var item in values) { if (item is System.Windows.Data.ICollectionView collectionView) { // 获取视图包装的原始集合 var originalCollection = collectionView.SourceCollection; // 获取视图当前选中项 var currentItem = collectionView.CurrentItem; // 处理需要的属性 res.Add(new CollectionContainer() { Collection = originalCollection }); } else if (item is IEnumerable enumerableItem && item != null) { res.Add(new CollectionContainer() { Collection = enumerableItem }); } }
注意事项
- 使用反射时要处理属性不存在的场景,避免空引用异常;
- 使用
dynamic时需确保属性真实存在,否则会抛出运行时错误; - 若对象是第三方框架生成的动态代理,需参考框架文档确认属性访问方式。
内容的提问来源于stack exchange,提问作者Mihir Choudhary
相关产品推荐
相关产品推荐

