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());
}
(完)