动态访问属性的最佳实践是什么?

3

我有一个类:

public class ActionReportEntity
{
    public string Caption { get; set; }
    public string Description { get; set; }
    public string Item1 { get; set; }
    public string Item2 { get; set; }
    public string Item3 { get; set; }
    public string Item4 { get; set; }
    public string Item5 { get; set; }
    public string Item6 { get; set; }
    public string Item7 { get; set; }
    public string Item8 { get; set; }
    public string Item9 { get; set; }
    public string Item10 { get; set; }
}

我希望能够动态地填充项目1至项目(1-10),我通过以下代码实现了这个属性:

Regex regex=new Regex("Item[0-9]+");
var props = typeof(ActionReportEntity)
.GetProperties()
.Where(p => regex.IsMatch(p.Name))
.OrderBy(p=>p.Name.Substring(4).ToInteger());

但我认为这种方法不好也不够强大,因为可能会有人重构这个类并添加一些突然的属性,比如Item50或更改某个属性。

我认为我必须使用属性,但我还没有使用它。

如何实现动态属性的最佳实践?

更新:

提到我想在网格或报告中绑定此类,所以我不想改变我的类结构,因为我无法将列表属性绑定到网格或在报告中使用它

3个回答

1
然后,全能的程序员发明了List<>,它来自于IEnumerable家族。他还说过,“你不应该迭代硬编码的变量名”。这让人感到非常欣喜 :)
只需创建一个public List<string> Items { get; set; },并将所有字符串添加到其中,这样可以在各个方面使您的生活更轻松。

一个报告无法处理IEnumerable?无论如何,您都会将IEnumerable添加到类中。当您需要迭代时,可以将所有Item#变量复制到列表中,迭代列表,然后将它们复制回去(您只需要编写“复制”和“放回”算法)。它将完美地工作,但我确实觉得无法处理IEnumerable意味着您有更大的潜在问题... - Flater
假设我有一个网格,如何将属性列表绑定到网格? - Reza ArabQaeni
这是一个非常开放的问题。您使用的是MVC3、MVC2、常规数据网格等等?我无法回答这个问题,除非更深入地了解您的问题,我认为这可能超出了手头问题的范围。一般来说:使用IEnumerables。我建议不要使用硬编码变量,但如果必须使用,仍然可以将IEnumerable用作临时存储以处理变量,然后将它们复制回其原始变量。 - Flater
好的,我有一个在Windows表单中的DataGridView。我的主要问题是如何区分动态属性和其他属性(我认为属性可以做到,但我不知道怎么做?)。 - Reza ArabQaeni
最后一条评论,因为这篇文章已经太长了 :) 你是否开启了AutoGenerateColumns?如果是的话,你的DataGridView将会自动为所有项目生成列。如果你在Google上搜索“DataGridView List”,你可以找到更多相关信息,你并不是第一个对此有疑问的人 :) - Flater
显示剩余4条评论

0

最简单的方法是将它们存储在一些简单的数据结构中。


0

我知道你已经表明不想改变你的类结构,但是你是否愿意在不改变公共结构的情况下改变类的内部结构呢?如果是这样,你可以保留属性不变,只需使用数组作为后备字段。然后,您可以提供一个Update方法来通过索引更新单个属性或一次性更新所有10个属性。

public class ActionReportEntity
{
    private String[] items = new String[10];

    public string Caption { get; set; }
    public string Description { get; set; }
    public string Item1 { get { return items[0]; } set { items[0] = value; } }
    public string Item2 { get { return items[1]; } set { items[1] = value; } }
    public string Item3 { get { return items[2]; } set { items[2] = value; } }
    public string Item4 { get { return items[3]; } set { items[3] = value; } }
    public string Item5 { get { return items[4]; } set { items[4] = value; } }
    public string Item6 { get { return items[5]; } set { items[5] = value; } }
    public string Item7 { get { return items[6]; } set { items[6] = value; } }
    public string Item8 { get { return items[7]; } set { items[7] = value; } }
    public string Item9 { get { return items[8]; } set { items[8] = value; } }
    public string Item10 { get { return items[9]; } set { items[9] = value; } }

    public void UpdateItem(Int32 index, String value)
    {
        if (index >= items.Length)
            throw new ArgumentException();

        items[index] = value;
    }
    public void UpdateItem(params String[] values)
    {
        if (values.Length != items.Length)
            throw new ArgumentException();

        for (int i = 0; i < values.Length; i++)
        {
            items[i] = values[i];                
        }
    }

}

谢谢您的回答,但是使用列表如何帮助我? - Reza ArabQaeni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接