Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计器中未序列化派生集合属性_C#_.net_Winforms_Windows Forms Designer - Fatal编程技术网

C# 设计器中未序列化派生集合属性

C# 设计器中未序列化派生集合属性,c#,.net,winforms,windows-forms-designer,C#,.net,Winforms,Windows Forms Designer,我有一个类,它派生自一个集合,该集合有一个属性MyString,即 public class CollectionItem { public bool MyBoolean { get; set; } public int MyInteger { get; set; } } public class MyCollection : List<CollectionItem> { [DesignerSerializationVisibility

我有一个类,它派生自一个集合,该集合有一个属性MyString,即

  public class CollectionItem
  {
    public bool MyBoolean { get; set; }

    public int MyInteger { get; set; }
  }

  public class MyCollection : List<CollectionItem>
  {
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public string MyString { get; set; }

    public MyCollection()
    {
      MyString = "Hello";
    }
  }

谁能告诉我,为了将MyString属性序列化到表单设计器,我还需要做些什么

默认CodeDom集合序列化程序不会序列化集合的属性。您可以通过从
CodeDomSerializer
派生来创建自定义序列化程序。然后为类注册自定义序列化程序:

[DesignerSerializer(typeof(MyCollectionSerializer), typeof(CodeDomSerializer))]
public class MyCollection : List<CollectionItem>
然后,
MyString
属性也将被序列化:

// 
// dummyControl1
// 
...
this.dummyControl1.MyCollection.Add(collectionItem1);
this.dummyControl1.MyCollection.Add(collectionItem2);
this.dummyControl1.MyCollection.Add(collectionItem3);
this.dummyControl1.MyCollection.MyString = "Hello";
...
[DesignerSerializer(typeof(MyCollectionSerializer), typeof(CodeDomSerializer))]
public class MyCollection : List<CollectionItem>
using System.CodeDom;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
public class MyCollectionSerializer : CodeDomSerializer
{
    public override object Serialize(IDesignerSerializationManager manager, object value)
    {
        var baseSerializer = (CodeDomSerializer)manager.GetSerializer(
            typeof(MyCollection).BaseType, typeof(CodeDomSerializer));
        var statements = (CodeStatementCollection)baseSerializer.Serialize(manager, value);
        var property = TypeDescriptor.GetProperties(value)[nameof(MyCollection.MyString)];
        if (property.ShouldSerializeValue(value))
        {
            var targetObject = base.GetExpression(manager, value);
            var cpre = new CodePropertyReferenceExpression(targetObject, property.Name);
            var cpe = new CodePrimitiveExpression(property.GetValue(value));
            var cas = new CodeAssignStatement(cpre, cpe);
            statements.Add(cas);
        }
        return statements;
    }
} 
// 
// dummyControl1
// 
...
this.dummyControl1.MyCollection.Add(collectionItem1);
this.dummyControl1.MyCollection.Add(collectionItem2);
this.dummyControl1.MyCollection.Add(collectionItem3);
this.dummyControl1.MyCollection.MyString = "Hello";
...