Список <int>дизайнерских сериализаций - PullRequest
1 голос
/ 20 июня 2011

Почему Свойство MyIntList ниже правильно интерпретирует DesignerSerializationVisibility.Content, что приводит к следующему выводу в конструкторе:

 this.myControl1.MyIntList.Add(1);
 this.myControl1.MyIntList.Add(2);
 this.myControl1.MyIntList.Add(3);

, в то время как MyClassIntList один выводит следующее?

this.myButton1.MyClassIntList = new MyClass(((System.Collections.Generic.List<int>)(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;
    }

}

Вот полный исходный код 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"]);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...