使用客户属性编辑器序列化静态类实例属性

时间:2016-04-05 17:04:39

标签: c# .net winforms serialization designer

我是一个有内部分部类的大型部分类和一个有很多静态成员的非部分类:

public partial class kField
{
    public partial class Campaign
    {
        public class Brand
        {
            public static kFieldClass id = new kFieldClass("id", typeof(long));
            public static kFieldClass abc = new kFieldClass("abc", typeof(long));
            ...
        }
    }
}

通过反射,我构建了一个列表,其中包含具有静态成员的所有类。

现在我想以某种方式存储"链接"在另一个类别的财产中的其中一个成员。

    [DefaultValue(null)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public kFieldClass Field
    {
        get; set;
    }

我为visual studio(在树视图中显示孔列表)构建了一个自定义编辑器(主要基于this),工作正常。

Image Custom editor

我现在的问题是,设计人员无法在Field属性中存储静态实例(kFieldClass)。 所以我认为我有两个选择

  1. 制作" Field" property as string并用dot-notation(kField.Campaign.Brand.id)存储信息,然后通过反射获取静态实例。 问题:我不能为字符串属性设置自定义编辑器吗?或者有什么办法吗?

  2. 为属性/ kFieldClass创建一些序列化程序,以便设计人员可以存储该值。我不认为这是可能的,也不是正确的方法。

  3. 我已经玩过"使用属性的自定义TypeConverter,但我没有关于与自定义编辑器交互的运气。

1 个答案:

答案 0 :(得分:0)

事实上,可以为任何属性添加自定义设计器,因此我已将我的属性更改为字符串:

    [DefaultValue(null)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    [TypeConverter(typeof(kFieldTypeConverter))]
    [Editor(typeof(kFieldDesignerEditor), typeof(System.Drawing.Design.UITypeEditor))]
    public string Field 
    ...

所以我的静态成员是通过反射转换为字符串,这有点乱,但它有效。

这就留下了这个问题:属性编辑器中的值(VS属性网格中可见的部分)为空(但属性已填充,可以填充,可以读取)。但是,这部分可以完全删除:TypeConverter是不必要的!