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

如何使用C#按名称检索AutoCAD SymbolTable条目

AutoCAD .NET:VB.NET转C#时按名称访问符号表对象的问题

我有多年VB.NET使用经验,目前正将旧版AutoCAD自定义库从VB.NET迁移至C#,在按名称引用标注样式、图层这类符号表对象时遇到障碍。

VB.NET 可行实现代码

Dim dsTbl as DimStyleTable = acTrans.GetObject(dwgDB.DimStyleTableId, OpenMode.ForRead)
If dsTbl.Has(recName) then
    Dim dsTblRec as DimStyleTableRecord = acTrans.GetObject(dsTbl(recName), OpenMode.ForWrite)
    'Do some stuff with dsTblRec
End if

尝试的C#代码(报错)

第一种写法:

DimStyleTable dsTbl = (DimStyleTable)acTrans.GetObject(dwgdb.DimStyleTableId,OpenMode.ForRead);
If (dsTbl.Has(recName))
{
DimStyleTableRecord dsTblRec = (DimStyleTableRecord)acTrans.GetObject(dsTbl(recName), OpenMode.ForWrite);
//Do some stuff with dsTblRec
}

第二种写法:

DimStyleTable dsTbl = dwgDB.DimStyleTableId.GetObject(OpenMode.ForRead) as DimStyleTable;
DimStyleTableRecord dsTblRec = acTrans.GetObject(dsTbl(recName), OpenMode.ForWrite) as DimStyleTableRecord;

Visual Studio始终对dsTbl(recName)的引用报错,已确认dsTbl不为空,想了解写法存在什么问题?是否必须遍历表中所有条目才能找到目标记录?同时访问BlockTableRecords时也存在同样问题,C#中dsTbl(recName)是不是不返回ObjectId?


问题原因与解决方法

  • 核心语法差异:VB.NET里的dsTbl(recName)是调用符号表类的默认索引器,而C#中访问索引器的语法是dsTbl[recName](方括号替代圆括号),这是报错的直接原因。
  • 正确的C#实现:
DimStyleTable dsTbl = (DimStyleTable)acTrans.GetObject(dwgDB.DimStyleTableId, OpenMode.ForRead);
if (dsTbl.Has(recName))
{
    DimStyleTableRecord dsTblRec = (DimStyleTableRecord)acTrans.GetObject(dsTbl[recName], OpenMode.ForWrite);
    // 处理标注样式记录的逻辑
}
  • 关于遍历的疑问:不需要遍历所有条目,用[recName]索引器可以直接获取对应记录的ObjectId,逻辑和VB.NET完全一致,仅语法不同。BlockTable、LayerTable等其他符号表的处理方式同理,把圆括号改成方括号即可。
  • 补充说明:所有AutoCAD .NET的符号表类都实现了按名称访问的索引器,C#中通过表对象[名称]就能拿到对应记录的ObjectId,和VB.NET的默认索引器行为完全匹配。

内容的提问来源于stack exchange,提问作者David Eisenbeisz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:00:03