动态访问属性的最佳实践
本文关键字:最佳 访问 属性 动态 | 更新日期: 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];
}
}
}