如何让设计器在WinForms中序列化一组对象?

时间:2012-05-02 13:06:57

标签: c# winforms serialization windows-forms-designer

我有一个班级:

public class Filter
{
    public Filter (string name, string value)
    {
        Name = name;
        Value = value;
    }

    public string Name {get; private set;}
    public string Value {get; set;}
}

收集课:

public class FilterCollection : Collection<Filter>
{
   // code elided
}

我的组件类:

public class MyComponent : Component
{
    // ...

    [Editor(typeof(FilterEditor), typeof(UITypeEditor))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public FilterCollection Filters { get; set; }

    // ...
}

问题是设计师未正确序列化

我确定我错过了一些东西,但我不知道是什么。

附加信息

我希望designer.cs文件具有以下内容:

myComponent.Filters.Add (new Filter ("some name", "some value"));
myComponent.Filters.Add (new Filter ("other name", "other value"));

这可行吗?

1 个答案:

答案 0 :(得分:3)

好的,问题解决了。

我需要为过滤器类使用 TypeConverter

internal class FilterConverter : TypeConverter
{
    public override bool CanConvertTo (ITypeDescriptorContext context, Type destinationType)
    {
        return destinationType == typeof(InstanceDescriptor) || base.CanConvertTo (context, destinationType);
    }

    public override object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(InstanceDescriptor) && value is Filter)
        {
            ConstructorInfo constructor = typeof (Filter).GetConstructor (new[] {typeof (string), typeof (string)});

            var filter = value as Filter;
            var descriptor = new InstanceDescriptor (constructor, new[] {filter.Name, filter.Value}, true);

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

然后将转换器添加到 Filter 类中,如下所示:

[TypeConverter(typeof(FilterConverter))]
public class Filter
{
    // ...
}

这里需要注意的重要事项是使用 Filter 构造函数的必需参数创建实例描述符。此外,您需要将 InstanceDescriptor 构造函数的最后一个参数( isComplete )设置为 true