如何使用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
相关产品推荐
相关产品推荐

