我尝试深度复制ToolStripMenuItems以将副本添加到其他不同的ToolStripMenu中。
当我尝试序列化ToolStripMenuItem时,它返回Nothing(下面代码中的第4行)并且无法创建该ToolStripMenuItem的新实例。
Public Module Extensions
<System.Runtime.CompilerServices.Extension()> _
Public Function DeepCopy(Of T)(ByVal Obj As T) As T
If Obj.GetType().IsSerializable = False Then Return Nothing
Using MStream As New MemoryStream
Dim Formatter As New BinaryFormatter
Formatter.Serialize(MStream, Obj)
MStream.Position = 0
Return DirectCast(Formatter.Deserialize(MStream), T)
End Using
End Function
End Module
我的副本
Dim tsmiCopy As ToolStripMenuItem = tsmiOriginal.DeepCopy()
答案 0 :(得分:2)
没有Winform Control是可序列化的,因为它们都带有活动窗口的句柄,根据定义,它与序列化不兼容。
所以你必须找到另一种方法。我的建议是创建一个构建全新MenuItems的函数,并在表单上随时调用它。
为此,您在Designer中创建菜单,然后打开文件“MyForm.Designer.vb”并复制创建菜单的部分,然后将其放入函数中。
答案 1 :(得分:1)
正确的序列化需要了解内部(私有成员),以便可以恢复状态,因此只能由给定类型本身完成。因此,如果给定类型不可序列化,您将需要以不同的方式解决更广泛的问题,或解决问题(可能通过执行MemberwiseClone
),这可能会破坏您对深度克隆的定义
答案 2 :(得分:0)
我是根据这篇文章做到的: http://www.codeproject.com/Articles/1111658/Fast-Deep-Copy-of-Objects-by-Expression-Trees-Csha?msg=5277674
请注意: 在创建WinForms控件的克隆时,将断开父子连接(父控件不知道克隆对象)。您必须使用
插入新控件 target.AddControl(clone)
确保重新创建此连接并显示克隆的控件