Лучшая практика для достижения свойств динамически? - PullRequest
3 голосов
/ 28 декабря 2011

У меня есть класс:

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 ]

1 голос
/ 28 декабря 2011

И затем Всемогущий Программист изобрел List<>, который происходил из семьи IEnumerable.Он также заявил: «Не перебирай жестко закодированные имена переменных».И было много чего радоваться:)

Просто сделайте public List<string> Items { get; set; } и добавьте туда все свои строки, это облегчит вашу жизнь всеми возможными способами.

0 голосов
/ 28 декабря 2011

Я знаю, что вы указали, что не хотите менять структуру своего класса, но готовы ли вы изменить внутреннюю структуру класса без изменения публичной структуры? Если это так, вы можете оставить свойства как есть, и просто использовать массив в качестве вспомогательного поля. Вы можете предоставить им 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];                
        }
    }

}
0 голосов
/ 28 декабря 2011

Самый простой способ - хранить их в некоторой простой структуре данных.

...