如何创建具有相同属性的数组

本文关键字:属性 数组 何创建 创建 | 更新日期: 2023-09-27 18:14:01

我要做的就是创建一个属性网格。它会保存输入0-5或输出1-64这样的东西,它们会有子属性,如name, id等。现在我的代码非常简单,我分别初始化了每一个。当我想将它们保存为文本文件并意识到这样做会导致代码墙时,这就产生了一个问题。而不是仅仅能够做一个for循环,我将不得不单独抓取每一个写入文本文件。我想知道是否有更好的方法来使用数组或列表来做到这一点。

这是我现在的数据:

        [CategoryAttribute("Input 0"), DescriptionAttribute("Name of Input 0"), DisplayName("Input 0: Name")]
    public string IName_0
    {
        get {return _Iname[0];}
        set {_Iname[0] = value;}
    }
    [CategoryAttribute("Input 0"), DescriptionAttribute("ID of Input 0"), DisplayName("Input 0: ID")]
    public int IID_0
    {
        get { return _IID[0]; }
        set { if ((64 > value) && (value >= 0)) _IID[0] = value; }
    }
    [CategoryAttribute("Input 1"), DescriptionAttribute("Name of Input 1"), DisplayName("Input 1: Name")]
    public string IName_1
    {
        get { return _Iname[1]; }
        set { _Iname[1] = value; }
    }
    [CategoryAttribute("Input 1"), DescriptionAttribute("ID of Input 1"), DisplayName("Input 1: ID")]
    public int IID_1
    {
        get { return _IID[1]; }
        set { if ((64 > value) && (value >= 0)) _IID[1] = value; }

对于每个输入都是这样。

如何创建具有相同属性的数组

首先,您必须意识到,当在PropertyGrid上显示属性时,在集合中包含属性将导致它们在集合下分组在一起。
因此,拥有一个string s的集合和一个int s的集合将打破当前的结构:

  1. 将成对的属性(名称和ID)组合在一起;
  2. 在属性网格的根级拥有所有属性。

话虽如此,你可以通过让问题2变得更糟来解决问题1。
创建两个类:

  • MyClass -含有NameIID性质。
  • MyClassCollection -一个容器类(很可能使用底层List)。

为了缓解问题#2,您可以在初始化时添加代码来扩展所有节点,如下所示。

如果您尝试这样做,您会注意到"容器"(MyClassCollectionMyClass)在显示时将有一些不希望的描述文本出现在它们旁边。这就是这篇文章派上用场的地方。

你的属性应该是:

[DisplayName("Some info here"),
DescriptionAttribute("Some more descriptive info here...")]
virtual public MyClassCollection MyData { get; set; }

和您的类定义将沿着以下行:

public class MyClass
{
    public string Name
    {
        get { return _name;  }
        set { _name = value; }
    }
    public int IID
    {
        get { return _iid; }
        set { if ((64 > value) && (value >= 0)) _iid = value; }
    }
    private string _name;
    private int    _iid;
}
public class MyClassCollection : CollectionBase
{
    // See the article for code for the overrides (for CollectionBase) and implementation (for ICustomTypeDescriptor)
}

如果您看一下上面提到的关于调整容器类的显示文本的文章,您将不得不对上面的类进行一些调整。