我有一个类:
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/