C# 列表<;int>;设计器序列化

C# 列表<;int>;设计器序列化,c#,.net,serialization,collectioneditor,C#,.net,Serialization,Collectioneditor,为什么下面的MyIntList属性正确解释了DesignerSerializationVisibility.Content在设计器中生成以下输出: this.myControl1.MyIntList.Add(1); this.myControl1.MyIntList.Add(2); this.myControl1.MyIntList.Add(3); 当MyClassIntList one输出以下内容时 this.myButton1.MyClassIntList = new MyClass

为什么下面的MyIntList属性正确解释了DesignerSerializationVisibility.Content在设计器中生成以下输出:

 this.myControl1.MyIntList.Add(1);
 this.myControl1.MyIntList.Add(2);
 this.myControl1.MyIntList.Add(3);
当MyClassIntList one输出以下内容时

this.myButton1.MyClassIntList = new MyClass(((System.Collections.Generic.List<int>)(resources.GetObject("myControl1.MyClassIntList"))));
this.myButton1.MyClassIntList=newmyclass(((System.Collections.Generic.List)(resources.GetObject(“myControl1.MyClassIntList”))));
以下是自定义控件类源代码:

[Serializable]
public class MyControl : Control
{
    public MyControl()
        : base()
    {
    }

    private List<int> myIntList = new List<int>(new int[] { 1, 2, 3 });

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public List<int> MyIntList
    {
        get { return myIntList; }
        set { myIntList = value; }
    }

    internal bool ShouldSerializeMyIntList()
    {
        return true;
    }

    private MyClass myClassIntList = new MyClass(new List<int>(new[] { 1, 2, 3 }));

    public MyClass MyClassIntList
    {
        get { return myClassIntList; }
        set { myClassIntList = value; }
    }

    internal bool ShouldSerializeMyClassIntList()
    {
        return true;
    }

}
[可序列化]
公共类MyControl:Control
{
公共MyControl()
:base()
{
}
私有列表myIntList=新列表(新的int[]{1,2,3});
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公共列表MyIntList
{
获取{return myIntList;}
设置{myIntList=value;}
}
内部bool应序列化MyIntList()
{
返回true;
}
private MyClass myClassIntList=new MyClass(new List(new[]{1,2,3}));
公共MyClass MyClassIntList
{
get{return myclassistList;}
设置{myClassIntList=value;}
}
内部bool应序列化MyClassIntList()
{
返回true;
}
}
以下是完整的Form1.cs源代码,如果您想测试它:

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
}

[Serializable]
public class MyControl : Control
{
    public MyControl()
        : base()
    {
    }

    private List<int> myIntList = new List<int>(new int[] { 1, 2, 3 });

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public List<int> MyIntList
    {
        get { return myIntList; }
        set { myIntList = value; }
    }

    internal bool ShouldSerializeMyIntList()
    {
        return true;
    }

    private MyClass myClassIntList = new MyClass(new List<int>(new[] { 1, 2, 3 }));

    public MyClass MyClassIntList
    {
        get { return myClassIntList; }
        set { myClassIntList = value; }
    }

    internal bool ShouldSerializeMyClassIntList()
    {
        return true;
    }

}

[Serializable, TypeConverter(typeof(MyClassConverter))]
public class MyClass
{
    public MyClass(List<int> list)
    {
        myIntList = list;
    }

    private List<int> myIntList = new List<int>(new int[] { 1, 2, 3 });

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public List<int> MyIntList
    {
        get { return myIntList; }
        set { myIntList = value; }
    }
}

class MyClassConverter : ExpandableObjectConverter
{

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(InstanceDescriptor))
            return true;
        return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (value is MyClass)
        {

            if ((destinationType == typeof(InstanceDescriptor)))
            {
                MyClass myClass = (MyClass)value;

                object[] properties = new object[1];
                Type[] types = new Type[1];

                types[0] = typeof(List<int>);
                properties[0] = myClass.MyIntList;

                ConstructorInfo ci = typeof(MyClass).GetConstructor(types);
                return new InstanceDescriptor(ci, properties);
            }

        }

        return base.ConvertTo(context, culture, value, destinationType);
    }

    public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
    {
        return new MyClass((List<int>)propertyValues["MyIntList"]);
    }

}
公共部分类MyForm:Form
{
公共MyForm()
{
初始化组件();
}
}
[可序列化]
公共类MyControl:Control
{
公共MyControl()
:base()
{
}
私有列表myIntList=新列表(新的int[]{1,2,3});
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公共列表MyIntList
{
获取{return myIntList;}
设置{myIntList=value;}
}
内部bool应序列化MyIntList()
{
返回true;
}
private MyClass myClassIntList=new MyClass(new List(new[]{1,2,3}));
公共MyClass MyClassIntList
{
获取{返回myClassIntList;}
设置{myClassIntList=value;}
}
内部bool应序列化MyClassIntList()
{
返回true;
}
}
[可序列化,类型转换器(类型化(MyClassConverter))]
公共类MyClass
{
公共MyClass(列表)
{
myIntList=列表;
}
私有列表myIntList=新列表(新的int[]{1,2,3});
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公共列表MyIntList
{
获取{return myIntList;}
设置{myIntList=value;}
}
}
类MyClassConverter:ExpandableObjectConverter
{
公共覆盖布尔CanConvertTo(ITypeDescriptorContext上下文,类型destinationType)
{
if(destinationType==typeof(InstanceDescriptor))
返回true;
返回base.CanConvertTo(上下文,destinationType);
}
公共重写对象转换为(ITypeDescriptorContext上下文、CultureInfo区域性、对象值、类型destinationType)
{
if(值为MyClass)
{
如果((destinationType==typeof(InstanceDescriptor)))
{
MyClass MyClass=(MyClass)值;
对象[]属性=新对象[1];
类型[]类型=新类型[1];
类型[0]=typeof(列表);
属性[0]=myClass.MyIntList;
ConstructorInfo ci=typeof(MyClass).GetConstructor(types);
返回新的InstanceDescriptor(ci、属性);
}
}
返回base.ConvertTo(上下文、区域性、值、destinationType);
}
公共覆盖布尔GetCreateInstanceSupported(ITypeDescriptorContext上下文)
{
返回true;
}
公共重写对象CreateInstance(ITypeDescriptorContext上下文,IDictionary属性值)
{
返回新的MyClass((列表)PropertyValue[“MyIntList”]);
}
}