C# Autocad-获取具有“长度”属性的所有图元-C/dynamic/reflection
即使您不了解Autocad,如果您了解动态C对象,也可以提供帮助 我正在尝试使用.NET C创建一个Autocad命令,该命令允许用户选择实体,并从这些实体中求和它们的长度 选择部分很好,我可以得到一个选定元素的列表 无齿性;或 数据库对象 但是,有许多子类型的AcadEntity具有长度属性。示例:AcadLine、AcadLWPolyline等-我不想在编译时知道所有这些类型是什么,而且我不能相信普通Autocad用户只使用其中一种或两种类型 因此,我必须检查这些对象是否包含属性Length并获取该值 显然,我可以试着接球:C# Autocad-获取具有“长度”属性的所有图元-C/dynamic/reflection,c#,reflection,com,autocad-plugin,dynamic-view,C#,Reflection,Com,Autocad Plugin,Dynamic View,即使您不了解Autocad,如果您了解动态C对象,也可以提供帮助 我正在尝试使用.NET C创建一个Autocad命令,该命令允许用户选择实体,并从这些实体中求和它们的长度 选择部分很好,我可以得到一个选定元素的列表 无齿性;或 数据库对象 但是,有许多子类型的AcadEntity具有长度属性。示例:AcadLine、AcadLWPolyline等-我不想在编译时知道所有这些类型是什么,而且我不能相信普通Autocad用户只使用其中一种或两种类型 因此,我必须检查这些对象是否包含属性Length
dynamic dynaEntity = (dynamic)AcadEntityInstance
try
{
double len = dynaEntity.Length;
LengthsPerType.AddOrSum(entityType, len);//personal method, no problem here
//entityType is a string found in AcadEntityInstance.ObjectName
//it returns an "AcDbLine", for instance, which is not an actual System.Type.
//The related Type is "AcadLine" - I can, for instance do (AcadLine)AcadEntityInstance
}
catch (System.Exception E) { }
但正如您所知,创建大量异常并不是编程的最佳方式。所以,我需要一个干净的解决方案
我试过什么
通过反射获取属性:
PropertyInfo prop = dynaEntity.GetType().GetProperty("Length");
PropertyInfo prop = AcadEntityInstance.GetType().GetProperty("Length");
PropertyInfo prop = ((object)AcadEntityInstance).GetType().GetProperty("Length");
所有这些总是返回null
看着给定的对象,它们是系统对象。Length属性(如果可用)将显示在“展开动态”视图中的调试器中
通过字符串获取属性值,用户可以使用RuntimeBinder通过字符串获取属性。。。所以我想在调用它之前可能有一种方法来检查它是否存在,对吗?
此代码有效,但只有在有长度的情况下才有效。在打最后一个电话之前,有没有办法核实一下
var ArgInfo = Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create(0, null);
var getMember = Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, "Length", dynaEntity.GetType(), new[] { ArgInfo });
var site = System.Runtime.CompilerServices.CallSite<Func<System.Runtime.CompilerServices.CallSite, object, object>>.Create(getMember);
var result = site.Target(site, dynaEntity);
我认为什么是好的解决方案
枚举动态对象的属性-我发现了很多关于这方面的问题,它们都使用第三方库,一点都不简单如果调试器可以枚举它们,为什么我不能?
实例化或强制转换到AcDbCurve对象(如果某个库中存在),我可能会丢失该对象。我已经读到这是所有曲线的父类型,我假设这些曲线包含长度。但没有IACADD曲线或类似曲线。
将动态对象强制转换为ExpandoObjects或类似于查找包含所列成员的接口的内容。
到目前为止,我发现:
第三方库-真的有必要吗?这真的应该这么复杂吗我不能使用/安装它们
前面提到的一个答案非常接近,但缺少一步
这篇文章解释了如何反映一个系统。这篇文章解释了如何反映一个系统。