调用Getter后c#属性改变的属性

本文关键字:属性 改变 Getter 调用 | 更新日期: 2023-09-27 18:15:03

下面的代码是我的一个类

的属性
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的属性,我希望它为真,这样我就可以对对象进行更改。我甚至明确指定了OpenMode。GetObject中的ForWrite。但是,当我进行如下代码段

所示的更改时
PlaceHolder.Visible = false;

它爆炸了。在调用getter后查看变量,可以发现IsWriteEnabled在对象返回后立即从true更改为false。如何保持启用写作?

调用Getter后c#属性改变的属性

似乎Transaction和DocumentLock对象负责管理对SubDMesh的写入。这两个对象都在getter的末尾被处理,所以写事务会立即回滚。

尝试在using (tr) using (docLock)内对SubDMesh进行所有操作(或将tr和doclock包装在另一个一次性类中以使它们存活更长时间)。

在打开交易之前锁定文档,并确保在完成更改SubDMesh后提交交易。

注意:使用Commit,即使你打开一个对象读。处理一个事务大约需要5倍的时间。