Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autocad-获取具有“长度”属性的所有图元-C/dynamic/reflection_C#_Reflection_Com_Autocad Plugin_Dynamic View - Fatal编程技术网

C# Autocad-获取具有“长度”属性的所有图元-C/dynamic/reflection

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

即使您不了解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或类似于查找包含所列成员的接口的内容。 到目前为止,我发现:

第三方库-真的有必要吗?这真的应该这么复杂吗我不能使用/安装它们 前面提到的一个答案非常接近,但缺少一步
这篇文章解释了如何反映一个系统。这篇文章解释了如何反映一个系统。