C# 设计器中未序列化派生集合属性
我有一个类,它派生自一个集合,该集合有一个属性MyString,即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
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";
...