在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的功能?