我正在尝试从 C# 询问 AutoCAD 对象。我对能够获取给定对象的所有属性并输出它们很感兴趣。例如,在下面的代码片段中,我循环浏览屏幕上的所有项目,并仅反映它们的一流属性。我关心的对象通常具有一流的 AcadObject 属性,它似乎包含我所追求的数据。问题是这是一个 __ComObject 并且它的许多嵌套属性对象不通过反射提供属性。例如,obj.AcadObject.Connectors 似乎是一个连接器对象的集合,我对此非常感兴趣。我可以使用调试器反映到那个深度,但从那里我只能猜测 Connectors 集合的属性和它的对象(. 网络调试器确实显示了一个 Count 属性,它提示了我)。使用 C# 的动态关键字和 .Net 4 中内置的 DLR/COM 绑定器,我可以探测这些对象。例如,我可以使用动态表达式来抓取 obj.AcadObject.Connectors[0].Name,猜测它具有 name 属性。我愿意使用动态表达式来获取这些属性,但我首先需要知道这些属性是什么。我进行了很多研究,似乎缺少对这些对象外观的参考。还有一些其他的对象挂在 AcadObject 上,我想导出它们。我愿意使用动态表达式来获取这些属性,但我首先需要知道这些属性是什么。我进行了很多研究,似乎缺少对这些对象外观的参考。还有一些其他的对象挂在 AcadObject 上,我想导出它们。我愿意使用动态表达式来获取这些属性,但我首先需要知道这些属性是什么。我进行了很多研究,似乎缺少对这些对象外观的参考。还有一些其他的对象挂在 AcadObject 上,我想导出它们。
var currentDocument = Application.DocumentManager.MdiActiveDocument;
var editor = currentDocument.Editor;
var database = editor.Document.Database;
var result = editor.SelectAll();
using (var transaction = database.TransactionManager.StartTransaction())
{
foreach (var id in result.Value.GetObjectIds())
{
var obj = transaction.GetObject(id, OpenMode.ForRead);
var properties = TypeDescriptor.GetProperties(obj.AcadObject).Cast<PropertyDescriptor>().OrderBy(prop => prop.Name);
writer.WriteLine("{0} ID:{1}", obj.GetType().Name, obj.Id);
writer.WriteLine("\r\n\r\n");
foreach (var property in properties)
{
var propertyObject = property.GetValue(obj.AcadObject);
writer.WriteLine(" {0} = {1}", property.Name, propertyObject);
}
writer.Write("\r\n\r\n\r\n");
}
}