如何让C#调试器Dynamic View节点在自定义DynamicDictionary类正常工作?
调试DynamicDictionary时Dynamic View报错的解决方法
问题场景
- 实现了
DynamicDictionary类:继承DynamicObject并实现IDictionary<string, object?>接口,支持以属性访问的方式操作字典键 - 调试时出现异常:
- 展开Dynamic View节点时报错:
Unable to evaluate the expression. Operation not supported. Unknown error: 0x80070057
- Results View可正常展开
- 移除
InnerObject的[DebuggerBrowsable(DebuggerBrowsableState.Never)]特性后,InnerObject的Dynamic View能正常显示
- 展开Dynamic View节点时报错:
原因分析
尽管DynamicObject实现了IDynamicMetaObjectProvider接口,但调试器的Dynamic View需要明确获取动态成员的名称集合才能正确渲染。默认的GetDynamicMemberNames实现未返回字典的键集合,导致调试器无法解析动态成员,进而抛出错误。
解决方案
重写DynamicObject的GetDynamicMemberNames方法,返回内部字典InnerObject的键集合:
public override IEnumerable<string> GetDynamicMemberNames() { return InnerObject.Keys; }
修改后,调试器可通过该方法获取所有动态成员(即字典键),正常渲染Dynamic View节点,同时也能保留InnerObject的[DebuggerBrowsable(DebuggerBrowsableState.Never)]特性,避免调试视图中显示冗余的内部对象。
内容的提问来源于stack exchange,提问作者Igor Levicki
相关产品推荐
相关产品推荐

