找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1134|回复: 1

[研讨] MethodInfo + Invoke

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-1-10 17:16:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
先留存

  1.         [LispFunction("InvokeMethod")]
  2.         public Object MyGetMethod(ResultBuffer rb)
  3.         {
  4.             if (rb != null)
  5.             {
  6.                 TypedValue[] values = rb.AsArray();
  7.                 if (values [0].TypeCode == (int)LispDataType .ObjectId && values .Length >= 2)
  8.                 {
  9.                     Document doc = Application.DocumentManager.MdiActiveDocument;
  10.                     Editor ed = doc.Editor;
  11.                     Database db = doc.Database;
  12.                     Transaction tr = db.TransactionManager.StartTransaction();

  13.                     var id = (ObjectId) values[0].Value;
  14.                     using (tr)
  15.                     {
  16.                         try
  17.                         {
  18.                            var argValues = new object[values .Length - 2];
  19.                            if (values.Length > 2)
  20.                            {
  21.                                for (int i = 0; i < argValues .Length; i++)
  22.                                {
  23.                                    argValues[i] = values[i + 2].Value;
  24.                                }
  25.                            }
  26.                             var obj = (DBObject) id.GetObject(OpenMode.ForRead);
  27.                             var str = (string) values[1].Value;
  28.                             MethodInfo methodInfo = obj.GetType().GetMethod(str);

  29.                             if (methodInfo != null)
  30.                             {
  31.                                 obj.UpgradeOpen();
  32.                                 var result = methodInfo.Invoke(obj,
  33.                                     BindingFlags .SuppressChangeType |BindingFlags .InvokeMethod |BindingFlags .IgnoreCase,
  34.                                     null,argValues  ,null);
  35.                                 return result;
  36.                             }
  37.                             else
  38.                             {
  39.                                 return null;
  40.                             }
  41.                         }
  42.                         catch (Autodesk.AutoCAD.Runtime.Exception)
  43.                         {
  44.                             return null;
  45.                         }
  46.                     }
  47.                 }
  48.                 else
  49.                 {
  50.                     return null;
  51.                 }
  52.             }
  53.             else
  54.             {
  55.                 return null;
  56.             }
  57.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2015-1-10 20:23:54 | 显示全部楼层
查询 DBObject 支持的 Method 、所需参数类型、返回值类型

  1.         [LispFunction("Method")]
  2.         public void MyGetMethod(ResultBuffer rb)
  3.         {
  4.             if (rb != null)
  5.             {
  6.                 TypedValue[] values = rb.AsArray();
  7.                 if (values[0].TypeCode == (int)LispDataType.ObjectId)
  8.                 {
  9.                     Document doc = Application.DocumentManager.MdiActiveDocument;
  10.                     Editor ed = doc.Editor;
  11.                     Database db = doc.Database;
  12.                     Transaction tr = db.TransactionManager.StartTransaction();
  13.                     var id = (ObjectId)values[0].Value;
  14.                     using (tr)
  15.                     {
  16.                         try
  17.                         {
  18.                             var obj = (DBObject)id.GetObject(OpenMode.ForRead);
  19.                             var methodInfos = obj.GetType().GetMethods();
  20.                             foreach (var tParam in methodInfos)
  21.                             {
  22.                                 var pams = tParam.GetParameters();
  23.                                 foreach (var type in pams)
  24.                                 {
  25.                                     ed.WriteMessage("\n\t\t{0}\t({1})\t\t{2}",
  26.                                     tParam.Name,
  27.                                     type.ToString(),
  28.                                     tParam .ReturnParameter.ToString()
  29.                                     );
  30.                                 }
  31.                             }
  32.                         }
  33.                         catch (Autodesk.AutoCAD.Runtime.Exception)
  34.                         {
  35.                             return ;
  36.                         }
  37.                     }
  38.                 }
  39.             }
  40.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 22:33 , Processed in 0.156894 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表