在Getter调用后更改C#属性的属性
下面的代码是我的一个类的属性在Getter调用后更改C#属性的属性,c#,autocad,C#,Autocad,下面的代码是我的一个类的属性 public SubDMesh PlaceHolder { get { Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Transaction tr = db.TransactionManager.S
public SubDMesh PlaceHolder
{
get
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Transaction tr = db.TransactionManager.StartTransaction();
DocumentLock docLock = doc.LockDocument();
using (tr)
using (docLock)
{
return tr.GetObject(IdOfPlaceHolder, OpenMode.ForWrite) as SubDMesh;
}
}
}
SubDMesh是AutoCAD API中的一个类,它有一个名为IsWriteEnabled的属性,我希望该属性为true,以便可以对对象进行更改。我甚至在GetObject中显式指定OpenMode.ForWrite。但是,当我在下一个代码段中进行更改时
PlaceHolder.Visible = false;
它爆炸了。调用getter后查看变量会发现,在返回对象之后,IsWriteEnabled就从true更改为false。如何保持写操作处于启用状态?事务和文档锁对象似乎负责管理对SubDMesh的写操作。这两个对象都在getter的末尾被释放,因此您的写事务将立即回滚
尝试在
中使用(tr)和使用(docLock)
对SubDMesh执行所有操作(或将tr和docLock包装在另一个一次性类中以使它们保持更长的生存时间)。在打开事务之前锁定文档,并确保在完成更改SubDMesh后提交事务
注意:使用提交,即使您正在打开一个对象进行读取。处理一笔交易的时间大约要长5倍。是否可写入
IsWriteEnabled
是公共财产?如果是,如果您尝试将var x=tr.GetObject(IdOfPlaceHolder,OpenMode.ForWrite)作为SubDMesh,会发生什么
x.IsWriteEnabled=true代码>?也许你误解了OpenMode.ForWrite的功能?