You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法使用C#标准Dictionary存储AutoCAD API的TypedValue与ResultBuffer

你的代码有两个关键问题导致XData不生效

1. 误用Append方法,导致TypedValue列表为空

C#中List<T>.Append()是LINQ方法,它不会修改原List对象,而是返回一个包含新增元素的新的 IEnumerable。你原代码里直接调用tvslist.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:09:59