C#索引器使用详解 在 C# 语法中当.操作符后面直接跟随中括号[]时这通常表示正在访问一个索引器Indexer。索引器允许对象像数组或字典一样通过索引来访问其元素或值。然而示例bt.[BlockTableRecord.ModelSpace]的写法是错误的因为它试图将命名空间或类型名作为索引器的参数这在语法上是不允许的。正确的用法需要将BlockTableRecord.ModelSpace作为一个明确的常量或属性值传递给索引器。1. 核心概念索引器访问在 C# 中索引器的使用格式为object[index]。当它跟在.后面时意味着我们正在访问某个对象实例的索引器。例如对于一个字典或列表// 假设 myDictionary 是一个 Dictionarystring, int int value myDictionary[key]; // 通过字符串索引访问值 // 假设 myList 是一个 Liststring string item myList[0]; // 通过整数索引访问元素在 AutoCAD .NET API 的上下文中BlockTable对象有一个索引器允许通过ObjectId或块名作为字符串来获取特定的BlockTableRecord。因此正确的访问方式应该是传入一个有效的键。2. 错误示例分析bt.[BlockTableRecord.ModelSpace]这段代码意图是获取模型空间的块表记录但语法是错误的BlockTableRecord.ModelSpace这看起来像是一个静态属性或常量用于标识模型空间。在 AutoCAD API 中确有一个常量用于此目的但它的访问方式通常是BlockTableRecord.ModelSpace并且其类型通常是ObjectId或一个特定的字符串常量如*Model_Space。bt.[...]这里的[BlockTableRecord.ModelSpace]被错误地当作了索引器的参数。索引器参数必须是表达式而不能直接是一个类型或命名空间的成员访问路径除非该路径最终计算出一个值。错误的直接原因编译器将[BlockTableRecord.ModelSpace]解析为一个特性Attribute应用而不是一个索引器参数。它期望在[和]之间找到一个特性类名或参数但遇到了BlockTableRecord.ModelSpace这个成员访问表达式这不符合特性语法因此会报告语法错误。3. 正确用法与修正要正确地从BlockTable获取模型空间记录需要将模型空间的标识符通常是一个ObjectId或字符串作为索引器的参数传入。以下是基于 AutoCAD .NET API 的标准做法using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; public void GetModelSpaceRecord() { // 获取当前文档和数据库 Document doc Application.DocumentManager.MdiActiveDocument; Database db doc.Database; // 开始事务 using (Transaction trans db.TransactionManager.StartTransaction()) { // 获取块表 BlockTable bt trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; // *** 正确用法使用索引器传入模型空间的 ObjectId *** // 模型空间的 BlockTableRecord 的 ObjectId 存储在 db.BlockTableId 对应的记录中但更常见的是通过一个常量名获取。 // AutoCAD 提供了一个常量来获取模型空间的 ObjectId。 ObjectId modelSpaceId SymbolUtilityServices.GetBlockModelSpaceId(db); // 方法1使用 ObjectId 作为键如果索引器支持 // 注意标准 BlockTable 索引器通常接受字符串作为块名。但通过 ObjectId 获取记录是更常见的做法。 // 因此通常我们使用 GetObject 方法而不是直接通过索引器。 BlockTableRecord modelSpace trans.GetObject(modelSpaceId, OpenMode.ForRead) as BlockTableRecord; // 方法2使用块名作为字符串索引如果已知 // 模型空间的块名通常是 *Model_Space // BlockTableRecord modelSpace trans.GetObject(bt[*Model_Space], OpenMode.ForRead) as BlockTableRecord; // ... 对 modelSpace 进行操作 ... trans.Commit(); } }关键修正点移除错误的.和中括号直接组合不应写成bt.[...]。使用正确的 API 获取标识符通过SymbolUtilityServices.GetBlockModelSpaceId(db)获取模型空间的ObjectId。这是 AutoCAD API 提供的标准方法 。通过事务获取对象在 AutoCAD 二次开发中几乎所有数据库对象的访问都应在事务内进行并使用Transaction.GetObject()方法传入ObjectId和打开模式来获取对象的可读写引用 。4. 其他合法场景.后接中括号的变体虽然bt.[BlockTableRecord.ModelSpace]是错误的但在 C# 中确实存在.后面紧跟[]的合法场景主要与条件访问运算符和数组/集合的成员访问有关场景语法示例说明条件访问索引器obj?.Items[0]?.是条件访问运算符。如果obj不为 null则访问其Items属性的索引器[0]。这里的[]是Items一个数组或集合的索引器而不是obj的。链式调用中的索引器GetData()?.Results[key]方法调用返回的对象通过条件访问其Results属性假设为字典然后使用索引器[key]获取值。访问数组的元素属性matrix[0, 0].ToString()访问多维数组matrix中特定位置的元素然后调用该元素的ToString方法。这里的[]是数组访问.是访问返回元素的成员。示例代码// 条件访问示例 Dictionarystring, Listint data GetData(); int? firstValue data?.Values.FirstOrDefault()?[0]; // 安全地访问可能为null的字典和列表 // 链式调用示例 string result service.GetResponse()?.Data[items]?.Name;总结核心原则在 C# 中.操作符后面直接跟[]的写法obj.[...]是无效语法。[]作为索引器访问必须紧跟在对象引用或返回对象的表达式之后中间不能有.。AutoCAD 特定修正要获取模型空间的BlockTableRecord应使用SymbolUtilityServices.GetBlockModelSpaceId(db)获取其ObjectId然后在事务中使用Transaction.GetObject()方法打开它 。合法模式合法的.与[]的关联出现在条件访问运算符?.之后或者当[]访问返回一个对象然后通过.访问该对象的成员时。参考来源【AutoCad 2025】【C#】零基础教程二——遍历 Entity 插件 》 AutoCAD 核心对象层级结构Teigha处理CAD样条曲线的方法解析用Teigha修改并保存CAD文件别再死记硬背了用C#玩转CAD多段线凸度Bulge从数学原理到代码实战一次讲透CAD二次开发之“添加对象到模型空间”