c# - 在 Winforms 和 .net 中难以在设计时保留引用内部属性的集合

标签 c# .net vb.net winforms serialization

解释这个问题的最简单方法是向您展示一些代码:

Public Interface IAmAnnoyed
End Interface

Public Class IAmAnnoyedCollection
    Inherits ObjectModel.Collection(Of IAmAnnoyed)
End Class

Public Class Anger
    Implements IAmAnnoyed
End Class

Public Class MyButton
    Inherits Button

Private _Annoyance As IAmAnnoyedCollection
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property Annoyance() As IAmAnnoyedCollection
    Get
        Return _Annoyance
    End Get
End Property

Private _InternalAnger As Anger
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property InternalAnger() As Anger
    Get
        Return Me._InternalAnger
    End Get
End Property

Public Sub New()
    Me._Annoyance = New IAmAnnoyedCollection
    Me._InternalAnger = New Anger
    Me._Annoyance.Add(Me._InternalAnger)
End Sub

End Class

这是设计器生成的代码:

Private Sub InitializeComponent()
    Dim Anger1 As Anger = New Anger
    Me.MyButton1 = New MyButton
    '
    'MyButton1
    '
    Me.MyButton1.Annoyance.Add(Anger1)
    // Should be: Me.MyButton1.Annoyance.Add(Me.MyButton1.InternalAnger)
    '
    'Form1
    '
    Me.Controls.Add(Me.MyButton1)

End Sub

我在上面添加了一条注释,以说明应该如何生成代码。现在,如果我放弃界面而只有 Anger 的集合,那么它会正确地持续存在。

有什么想法吗?

更新1

我受够了。这个问题专门与持久化接口(interface)集合有关,但现在在进一步测试中它不适用于普通集合。下面是一些更简单的代码:

Public Class Anger
End Class

Public Class MyButton
    Inherits Button

Private _Annoyance As List(Of Anger)
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property Annoyance() As List(Of Anger)
    Get
        Return _Annoyance
    End Get
End Property

Private _InternalAnger As Anger
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property InternalAnger() As Anger
    Get
        Return Me._InternalAnger
    End Get
End Property

Public Sub New()
    Me._Annoyance = New List(Of Anger)
    Me._InternalAnger = New Anger
    Me._Annoyance.Add(Me._InternalAnger)
End Sub

End Class

设计者以与原始问题相同的方式搞砸了持久性代码。

更新2

我已经弄清楚发生了什么。我想知道为什么有时它会起作用而不是其他人。它归结为我给内部属性和集合的名称。

如果我将属性“Annoyance”重命名为“WTF”,它将正确序列化,因为“WTF”按字母顺序位于集合名称“InternalAnger”之后。

看起来序列化程序正在按字母顺序创建对象实例,并且需要在创建集合时创建我的内部属性。

我可以通过重命名来解决这个问题,但这是一个 hack,我担心编写自定义序列化程序是一项艰巨的工作——我以前从未做过。

有什么想法吗?

更新3

我已经用 hack 回答了这个问题。除非 MS 改变 codedom 序列化设计器代码的方式,否则我对此非常有信心。

最佳答案

我在这里有点不合时宜,但是你不应该在那个只读属性上有一个私有(private)的 setter 吗?我的意思是,它无法序列化它无法设置的内容,对吗?

关于c# - 在 Winforms 和 .net 中难以在设计时保留引用内部属性的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2427551/

相关文章:

javascript - 如果我将 Div 设置为 runat ="server",则不显示 Jqwidgets 图表

vb.net - 查找字符串中的重复序列

c# - 在调试期间在 Visual Studio 中自动附加到子进程

c# - 在C#中使用正则表达式来匹配rtf格式的文本

c# - 亚马逊产品广告 API - 搜索多个 UPC

.net - "SHUTDOWN is in progress"的 SqlError.Number 是什么?

c# - 如何在 .Net Core 中引用项目

c# - 我的内部连接有问题

c# - 如何通过 C# 中的反射获取类型的 protected 和公共(public)属性

c# - Nunit Test中如何归档.Exists