25/04/2014
Сохранение и получение значений enum в ResBuf в .NET
Если вы сохраняете значение перечисления (enum) в resbuf как "ExtendedDataInteger16", тогда вы можете получить исключение неверного типа при попытке прочитать сохраненное значение из resbuf в перечисление.
Чтобы исключить эту ошибку, нужно сохранять значение как "ExtendedDataIneger32" или использовать "Enum.ToObject" как показано ниже:
Код - C#: [Выделить]
- public enum MyEnumType
- {
- spring,
- summer,
- fall,
- winter
- };
- [CommandMethod("ADDXDATA")]
- static public void AddXdata()
- {
- Database db = HostApplicationServices.WorkingDatabase;
- Editor ed
- = Application.DocumentManager.MdiActiveDocument.Editor;
- // Попросим пользователя выбрать примитив
- PromptEntityResult per = ed.GetEntity("Выберите примитив ");
- if (per.Status != PromptStatus.OK)
- return;
- using(Transaction tr = db.TransactionManager.StartTransaction())
- {
- RegAppTable regTable
- = (RegAppTable)tr.GetObject(
- db.RegAppTableId,
- OpenMode.ForWrite,
- false
- );
- String appName = "ADSK";
- if (regTable.Has(appName) == false)
- {
- RegAppTableRecord app = new RegAppTableRecord();
- app.Name = appName;
- regTable.Add(app);
- tr.AddNewlyCreatedDBObject(app, true);
- }
- Entity ent = tr.GetObject(
- per.ObjectId,
- OpenMode.ForWrite
- ) as Entity;
- //ent.XData = new ResultBuffer(
- // new TypedValue(1001, appName),
- // new TypedValue((int)DxfCode.ExtendedDataInteger32, MyEnumType.winter));
- ent.XData = new ResultBuffer(
- new TypedValue(1001, appName),
- new TypedValue((int)DxfCode.ExtendedDataInteger16, MyEnumType.winter));
- tr.Commit();
- }
- }
- [CommandMethod("READXDATA")]
- static public void ReadXdata()
- {
- Database db = HostApplicationServices.WorkingDatabase;
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- // Попросим пользователя выбрать примитив
- PromptEntityResult per = ed.GetEntity("Выберите примитив ");
- if (per.Status != PromptStatus.OK)
- return;
- using(Transaction tr = db.TransactionManager.StartTransaction())
- {
- Entity ent
- = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForWrite);
- using (ResultBuffer buf = ent.XData)
- {
- if (buf != null)
- {
- TypedValue[] tvArr = buf.AsArray();
- foreach (TypedValue tv in tvArr)
- {
- if (tv.TypeCode == (int)DxfCode.ExtendedDataInteger16)
- {
- // Работает только если значение enum value в
- // Xdata было сохранено как ExtendedDataInteger32
- // MyEnumType enumValue = (MyEnumType)tv.Value;
- // Работает в обоих случаях
- // если перечисление в Xdata было
- // сохранено как ExtendedDataInteger16
- // или как ExtendedDataInteger32
- MyEnumType enumValue
- = (MyEnumType)Enum.ToObject(typeof(MyEnumType), tv.Value);
- ed.WriteMessage("\n" + enumValue.ToString());
- }
- }
- }
- }
- tr.Commit();
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=701
Опубликовано 25.04.2014