动态获取属性的最佳做法?

时间:2011-12-28 12:00:08

标签: c# dynamic properties

我有一个班级:

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

我想动态地将Item1填充到Item(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 个答案:

答案 0 :(得分:1)

然后,全能程序员发明了List<>,他来自IEnumerable的家庭。他还说,“你不应该迭代硬编码的变量名称”。并且有很多值得高兴的是:)

只需制作一个public List<string> Items { get; set; }并在那里添加所有字符串,这样可以让您的生活更加轻松。

答案 1 :(得分:0)

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

答案 2 :(得分: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];                
        }
    }

}