我有一个班级:
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那样突然添加一些属性或更改属性。
我认为我必须使用属性,但我还没有使用它。
实现动态属性的最佳做法是什么?
更新
提到我想在网格或报表中绑定使用这个类,所以我不想改变我的类的结构,因为我不能将列表道具绑定到网格或在报表中使用它
答案 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];
}
}
}