c# - 如何让设计者序列化 WinForms 中的对象集合?

标签 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"));

这可行吗?

最佳答案

好的,问题解决了。

我需要为我的Filter 类使用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

关于c# - 如何让设计者序列化 WinForms 中的对象集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10414388/

相关文章:

java - 为什么我们在序列化过程中使用 serialVersionUID

django - 如何更改序列化程序中持续时间字段值的格式?

c# - XMLSigner 不再适用于 4.6.2 - 格式错误的引用元素

c# - 具有可变数量的填充零的数字数组的数字

c# - 反射如何检索分配给变量的数据?

java - 禁用每个 ObjectMapper 的字段序列化

c# - 解决方案范围 app.config/web.config?

c# - 如何使用列表框将文本文件字符串发送到文本框?

c# - 从窗体打开 Powerpoint 演示文稿

c# - 仅在 DataGridView 的某一列上使用手形光标