cad.net 修改Point3d字段内容

由于Point3d的字段是设置了set保护,那么我们可以利用不安全操作来进行:

.csproj加入:

<PropertyGroup>
    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
</PropertyGroup>

结构:
此类是用于优化,因此直接暴露字段
(不封装为属性减少栈帧,因为我们有一亿..百亿个点...那么多点上AOS啊...),
从而实现修改字段内容.

[Serializable]
[DebuggerDisplay("{DebuggerDisplay,nq}")]
[DebuggerTypeProxy(typeof(Point3D))]
public struct Point3D
{
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private string DebuggerDisplay => $"(X:{X},Y:{Y},Z:{Z})";

    public double X;
    public double Y;
    public double Z;
}

测试命令:

[CommandMethod(nameof(Test_Marshal))]
public void Test_Marshal()
{
    var dm = Acap.DocumentManager;
    var doc = dm.MdiActiveDocument;
    var ed = doc.Editor;
   
    Point3d pt = new(100, 50, 0);
    ed.WriteMessage("\n原始:" + pt.ToString());

    // 将Point3d指针转为Point3D指针,以此避开get保护,实现修改内部值
    unsafe
    {
        ((Point3D*)&pt)->X = 12345;//必须强转成这个指针类型,不然它为(Point3d*)
    }
    ed.WriteMessage("\n指针法:" + pt.ToString());
}

(完)

posted @ 2022-10-10 21:22  惊惊  阅读(362)  评论(0编辑  收藏  举报