C# から AutoCAD オブジェクトを調べようとしています。特定のオブジェクトのすべてのプロパティを取得して出力できることに興味があります。たとえば、以下のコード スニピットでは、画面上のすべてのアイテムをループして、それらのファースト クラスのプロパティを反映しています。私が気にかけているオブジェクトには、私が求めているデータを保持しているように見える第一級の AcadObject プロパティが含まれていることがよくあります。問題は、これが __ComObject であり、ネストされたプロパティ オブジェクトの多くがリフレクションを介してプロパティを提供しないことです。たとえば、obj.AcadObject.Connectors は、私が非常に興味を持っているコネクタ オブジェクトのコレクションのようです。デバッガを使用してその深さまで反映することはできますが、そこからは Connectors コレクションのプロパティを推測しなければなりません。そのオブジェクト (. ネットデバッガーは、私にヒントを与えた Count プロパティを表示します)。C# の dynamic キーワードと .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");
}
}