找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1612|回复: 0

[研讨] 通过 PropertyDescriptor 修改属性

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-1-10 00:23:23 | 显示全部楼层 |阅读模式

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

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

×
使用 PropertyDescriptor 获取属性很方便,PropertyDescriptor 还有一个 SetValue 方法,不过这个 value 需要一致才可以,否则可能造成崩溃,以下代码使用时在 double / int / short / Point3d 类型时可以使用

  1.         [LispFunction("mSetValue")]
  2.         public object MySetValue(ResultBuffer rb)
  3.         {
  4.             if (rb != null)
  5.             {
  6.                 TypedValue[] values = rb.AsArray();
  7.                 Document doc = Application.DocumentManager.MdiActiveDocument;
  8.                 Editor ed = doc.Editor;
  9.                 Database db = doc.Database;
  10.                 Transaction tr = db.TransactionManager.StartTransaction();

  11.                 if (values .Length > 1)
  12.                 {
  13.                     if (values[0].TypeCode != (int)LispDataType .ObjectId )
  14.                     {
  15.                         return null;
  16.                     }
  17.                     else if (values [1].TypeCode != (int)LispDataType .Text )
  18.                     {
  19.                         return null;
  20.                     }
  21.                     else
  22.                     {
  23.                         ObjectId id = (ObjectId) values[0].Value;
  24.                         string pName = ((string) values[1].Value).ToUpper();
  25.                         DBObject obj = (DBObject) id.GetObject(OpenMode.ForRead);
  26.                         using (tr)
  27.                         {
  28.                             try
  29.                             {
  30.                                 PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
  31.                                 var query =
  32.                                     props.OfType<PropertyDescriptor>()
  33.                                         .Where(r => (r.Name.ToUpper() == pName && !r.IsReadOnly));
  34.                                 if (query .Count( ) == 1)
  35.                                 {
  36.                                     var prop = query.First();
  37.                                     if (prop != null)
  38.                                     {
  39.                                         var value = values[2].Value ;
  40.                                         obj.UpgradeOpen();
  41.                                         prop.SetValue(obj, value);//类型待处理
  42.                                     }
  43.                                 }
  44.                                 else
  45.                                 {
  46.                                     return null;
  47.                                 }
  48.                             }
  49.                             catch (Exception)
  50.                             {
  51.                                 throw;
  52.                             }
  53.                             tr.Commit();
  54.                         }
  55.                     }
  56.                 }
  57.                 else if (values .Length ==1 && values [0].TypeCode == (int)LispDataType .ObjectId )
  58.                 {
  59.                     ObjectId id = (ObjectId)values[0].Value;
  60.                     DBObject obj = (DBObject)id.GetObject(OpenMode.ForRead);
  61.                     PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
  62.                     var query = props.OfType<PropertyDescriptor>().Where(r => (!r.IsReadOnly));
  63.                     foreach (var p in query)
  64.                     {
  65.                         ed.WriteMessage("\n" + p.Name);//打印读写属性
  66.                     }
  67.                     return null;
  68.                     
  69.                 }
  70.                 else
  71.                 {
  72.                     return null;
  73.                 }
  74.             }
  75.             return null;
  76.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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