马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
使用 PropertyDescriptor 获取属性很方便,PropertyDescriptor 还有一个 SetValue 方法,不过这个 value 需要一致才可以,否则可能造成崩溃,以下代码使用时在 double / int / short / Point3d 类型时可以使用
- [LispFunction("mSetValue")]
- public object MySetValue(ResultBuffer rb)
- {
- if (rb != null)
- {
- TypedValue[] values = rb.AsArray();
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- Transaction tr = db.TransactionManager.StartTransaction();
- if (values .Length > 1)
- {
- if (values[0].TypeCode != (int)LispDataType .ObjectId )
- {
- return null;
- }
- else if (values [1].TypeCode != (int)LispDataType .Text )
- {
- return null;
- }
- else
- {
- ObjectId id = (ObjectId) values[0].Value;
- string pName = ((string) values[1].Value).ToUpper();
- DBObject obj = (DBObject) id.GetObject(OpenMode.ForRead);
- using (tr)
- {
- try
- {
- PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
- var query =
- props.OfType<PropertyDescriptor>()
- .Where(r => (r.Name.ToUpper() == pName && !r.IsReadOnly));
- if (query .Count( ) == 1)
- {
- var prop = query.First();
- if (prop != null)
- {
- var value = values[2].Value ;
- obj.UpgradeOpen();
- prop.SetValue(obj, value);//类型待处理
- }
- }
- else
- {
- return null;
- }
- }
- catch (Exception)
- {
- throw;
- }
- tr.Commit();
- }
- }
- }
- else if (values .Length ==1 && values [0].TypeCode == (int)LispDataType .ObjectId )
- {
- ObjectId id = (ObjectId)values[0].Value;
- DBObject obj = (DBObject)id.GetObject(OpenMode.ForRead);
- PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
- var query = props.OfType<PropertyDescriptor>().Where(r => (!r.IsReadOnly));
- foreach (var p in query)
- {
- ed.WriteMessage("\n" + p.Name);//打印读写属性
- }
- return null;
-
- }
- else
- {
- return null;
- }
- }
- return null;
- }
|