如何从ListViewItem的Tag属性获取匿名类型对象的XPATH属性?
解决匿名类型赋值给Object后无法访问属性的问题
你碰到的这个问题很常见——当你把匿名类型对象赋值给ListViewItem.Tag,再用object类型去接收它时,编译阶段没法识别匿名类型的XPATH属性,所以才会抛出CS1061: 'object' does not contain a definition for 'XPATH'的错误。下面给你三种可行的解决办法:
1. 用dynamic类型接收Tag值(快速解决)
dynamic会把属性的解析推迟到运行时,只要你的Tag里确实存在XPATH属性,就能正常访问:
dynamic myObj = myListView.Items[0].Tag; string xpath = myObj.XPATH;
⚠️ 注意:这种方式没有编译期类型检查,如果后续Tag里的对象发生变化(比如没有XPATH属性了),运行时会抛出异常。
2. 创建显式类替代匿名类型(推荐,类型安全)
这是最稳妥的做法,先定义一个明确的类来承载你的数据:
// 先定义一个用于存储节点信息的类 public class NodeInfo { public string XPATH { get; set; } }
然后赋值和获取的时候都用这个类:
// 赋值时使用显式类 newListViewItem.Tag = new NodeInfo { XPATH = FindXPath(node) }; // 获取时强转成NodeInfo类型 NodeInfo myObj = (NodeInfo)myListView.Items[0].Tag; string xpath = myObj.XPATH;
这种方法有编译期类型检查,代码可读性和可维护性都更高,适合大多数场景。
3. 使用反射(不推荐,仅备用)
如果前两种方法都没法用,你可以通过反射在运行时获取属性值,但这种方式性能差且代码不直观:
Object myObj = myListView.Items[0].Tag; // 通过反射获取XPATH属性的值 string xpath = myObj.GetType().GetProperty("XPATH").GetValue(myObj).ToString();
内容的提问来源于stack exchange,提问作者JuMoGar
相关产品推荐
相关产品推荐

