【问题标题】:Serialize static class instance property with customer property editor使用客户属性编辑器序列化静态类实例属性
【发布时间】:2016-07-25 18:29:32
【问题描述】:

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

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;
    }

我为视觉工作室(在树视图中显示孔列表)构建了一个自定义编辑器(主要基于 this),效果很好。

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

  1. 将“Field”属性设为字符串并使用点符号 (kField.Campaign.Brand.id) 存储信息,然后通过反射获取静态实例。 问题:我不能有一个字符串属性的自定义编辑器吗?或者有什么办法吗?

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

我已经为该属性“玩”了一个自定义 TypeConverter,但在与自定义编辑器的交互方面我没有任何运气。

【问题讨论】:

  • Kalfany,我已将您的问题回滚为原始形式,并将您的修改移至您的自我回答中。我们相信问答格式可以帮助人们找到相关的问题和对他们有帮助的答案。

标签: c# .net winforms serialization designer


【解决方案1】:

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

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

所以我的静态成员通过反射从字符串转换为字符串,这有点混乱,但它可以工作。

这就留下了这个问题:属性编辑器中的值(在VS属性网格中可见的部分)为空(但属性已填充,可以填充,并且可以读取)。不过这部分可以完全去掉:不需要TypeConverter!

【讨论】:

    猜你喜欢
    • 2017-11-17
    • 2016-04-06
    • 1970-01-01
    • 2011-06-11
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多