C# 动态接触酒店的最佳实践?

C# 动态接触酒店的最佳实践?,c#,dynamic,properties,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

我有一门课:

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或更改属性

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

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

更新:


提到我想在网格或报表的绑定中使用这个类,所以我不想更改我的类的结构,因为我不能将列表属性绑定到网格或在报表中使用它最简单的方法是将它们存储在一些简单的数据结构中。

然后,全能的程序员发明了
列表
,谁来自
IEnumerable
家族。他还说,“你不应该重复硬编码的变量名”。还有很多值得庆幸的事情:)


只需创建一个
公共列表项{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];                
        }
    }

}
公共类ActionReportEntity
{
私有字符串[]项=新字符串[10];
公共字符串标题{get;set;}
公共字符串说明{get;set;}
公共字符串Item1{get{return items[0];}set{items[0]=value;}}
公共字符串Item2{get{return items[1];}set{items[1]=value;}
公共字符串Item3{get{return items[2];}set{items[2]=value;}}
公共字符串Item4{get{return items[3];}set{items[3]=value;}}
公共字符串Item5{get{return items[4];}set{items[4]=value;}}
公共字符串Item6{get{return items[5];}set{items[5]=value;}}
公共字符串Item7{get{return items[6];}set{items[6]=value;}}
公共字符串Item8{get{return items[7];}set{items[7]=value;}}
公共字符串Item9{get{return items[8];}set{items[8]=value;}}
公共字符串Item10{get{return items[9];}set{items[9]=value;}}
public void UpdateItem(Int32索引,字符串值)
{
如果(索引>=items.Length)
抛出新ArgumentException();
项目[指数]=价值;
}
public void UpdateItem(参数字符串[]值)
{
if(values.Length!=items.Length)
抛出新ArgumentException();
for(int i=0;i
+1对于“您不应该迭代硬编码的变量名”,我提到我想在网格或报表的绑定中使用此类,所以我不想更改类的结构,因为我无法将列表属性绑定到网格或在报表中使用。报表无法处理IEnumerable?无论哪种方式,您都会将IEnumerable添加到类中。当您需要迭代时,您可以将所有项变量复制到列表中,迭代列表,然后将它们复制回来(你只需要写一个“复制”和“放回”算法。它会工作得很好,但我确实觉得不能处理IEnumerable意味着你有一个更大的潜在问题……假设我有一个网格,如何将属性列表绑定到网格?这是一个真正的开放性问题。你在使用MVC3、MVC2、常规数据网格吗?…我无法回答。)在没有深入了解您的问题的情况下,我认为这可能超出了当前问题的范围。一般来说:使用IEnumerables。我建议使用硬编码变量,但如果必须,您仍然可以使用IEnumerable作为预处理变量的临时存储,然后将它们复制回原始变量B谢谢你的回答,但使用列表如何帮助我?