无法使用C#标准Dictionary存储AutoCAD API的TypedValue与ResultBuffer
你的代码有两个关键问题导致XData不生效
1. 误用Append方法,导致TypedValue列表为空
C#中List<T>.Append()是LINQ方法,它不会修改原List对象,而是返回一个包含新增元素的新的 IEnumerabletvslist.Append(...)却没有把返回值赋值给变量,导致tvslist始终是空的,最终生成的TypedValue[] tvs也是空数组,自然无法设置XData。
正确的做法是用List<T>.Add()方法直接向原列表添加元素:
foreach (var key in xd.Keys) { tvslist.Add(new TypedValue((int)key, xd[key])); }
2. Dictionary的无序性可能破坏XData的顺序要求
AutoCAD的XData对元素顺序有严格规定:
- 必须以**DXF码1001(ExtendedDataRegAppName)**作为第一个元素,指定注册的应用程序名
- 后续的XData元素必须紧跟在这个标识之后
而Dictionary<TKey, TValue>是无序集合,遍历Keys时的顺序不固定,有可能ExtendedDataInteger16这类元素会排在ExtendedDataRegAppName前面,导致生成的TypedValue数组不符合AutoCAD的要求,即使修正了Append的问题,也可能无法正常识别XData。
解决顺序问题的两种方式:
- 方式一:改用有序集合
比如使用SortedDictionary<DxfCode, object>,它会按DxfCode的枚举值自动排序(1001的枚举值小于其他扩展数据代码,会自动排在首位):SortedDictionary<DxfCode, object> xd = new SortedDictionary<DxfCode, object> { { DxfCode.ExtendedDataRegAppName, "TESTEAPP" }, { DxfCode.ExtendedDataInteger16, 1000 } }; - 方式二:用List手动维护顺序
直接用List<KeyValuePair<DxfCode, object>>存储,确保元素顺序符合XData要求:List<KeyValuePair<DxfCode, object>> xd = new List<KeyValuePair<DxfCode, object>> { { DxfCode.ExtendedDataRegAppName, "TESTEAPP" }, { DxfCode.ExtendedDataInteger16, 1000 } };
修正后的核心代码示例
// 用List维护正确的XData顺序 List<KeyValuePair<DxfCode, object>> xd = new List<KeyValuePair<DxfCode, object>> { { DxfCode.ExtendedDataRegAppName, "TESTEAPP" }, { DxfCode.ExtendedDataInteger16, 1000 } }; List<TypedValue> tvslist = new List<TypedValue>(); foreach (var kvp in xd) { tvslist.Add(new TypedValue((int)kvp.Key, kvp.Value)); } TypedValue[] tvs = tvslist.ToArray(); ResultBuffer rb = new ResultBuffer(tvs); ent.XData = rb;
内容的提问来源于stack exchange,提问作者Fernando
相关产品推荐
相关产品推荐

