动态访问属性的最佳实践

本文关键字:最佳 访问 属性 动态 | 更新日期: 2023-09-27 18:19:00

我有一个类:

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,或者改变一个属性。

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

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

更新:

提到我想在绑定网格或报告中使用这个类,所以我不想改变我的类的结构,因为我不能将列表prop绑定到网格或在报告中使用

动态访问属性的最佳实践

然后,全能程序员发明了List<>,它来自IEnumerable家族。他还指出,"你不应该迭代硬编码的变量名"。有很多值得高兴的事情:)

只是做一个public List<string> Items { get; set; }和添加所有的字符串在那里,这使你的生活更容易在任何可能的方式

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

我知道您已经表示不想更改您的类结构,但是您是否愿意在不更改公共结构的情况下更改类的内部结构?如果是这样,您可以保持属性不变,只使用一个数组作为后备字段。您可以提供一个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];                
        }
    }
}
相关文章: