如何创建具有相同属性的数组
本文关键字:属性 数组 何创建 创建 | 更新日期: 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的集合将打破当前的结构:
- 将成对的属性(名称和ID)组合在一起;
- 在属性网格的根级拥有所有属性。
话虽如此,你可以通过让问题2变得更糟来解决问题1。
创建两个类:
-
MyClass
-含有Name
和IID
性质。 -
MyClassCollection
-一个容器类(很可能使用底层List)。
为了缓解问题#2,您可以在初始化时添加代码来扩展所有节点,如下所示。
如果您尝试这样做,您会注意到"容器"(MyClassCollection
和MyClass
)在显示时将有一些不希望的描述文本出现在它们旁边。这就是这篇文章派上用场的地方。
你的属性应该是:
[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)
}
如果您看一下上面提到的关于调整容器类的显示文本的文章,您将不得不对上面的类进行一些调整。