Лично я не согласен с большинством других постеров здесь.Я думаю, что использование отражения должно быть ограничено теми ситуациями, в которых оно действительно требуется (проверка объекта, определенные ситуации с графическим интерфейсом и т. Д.).В этом случае, просто набрав немного больше текста, можно написать программу со строгим набором текста и продолжать делать то, что вы хотите.Я предложу две альтернативы.Обе альтернативы предоставят возможность доступа к вашим свойствам как по имени, так и по индексу.
В первом варианте я предполагаю, что нам разрешено изменять определение ваших свойств.Во втором варианте я предполагаю, что эти определения должны остаться неизменными.
Первый вариант перемещает данные в отдельный массив, добавляет вспомогательные методы для доступа к данным по индексу иизменяет свойства для использования вспомогательных методов:
private class Version1 {
private readonly string[] underlyingData=new string[50];
public string Foo1 { get { return ReadFoo(1); } set { SetFoo(1, value); } }
public string Foo2 { get { return ReadFoo(2); } set { SetFoo(2, value); } }
public string Foo3 { get { return ReadFoo(3); } set { SetFoo(3, value); } }
//......
public string Foo50 { get { return ReadFoo(50); } set { SetFoo(50, value); } }
private string ReadFoo(int index) {
return underlyingData[index-1]; //1-based indexing
}
private void SetFoo(int index, string value) {
underlyingData[index-1]=value; //1-based indexing
}
}
Вторая альтернатива оставляет определения свойств неизменными и два статических массива делегатов, представляющих функцию чтения и записи этих свойств.
private class Version2 {
private static readonly Func<Version2, string>[] readers=new Func<Version2, string>[] {
c => c.Foo1,
c => c.Foo2,
c => c.Foo3,
//......
c => c.Foo50,
};
private static readonly Action<Version2, string>[] writers=new Action<Version2, string>[] {
(c,v) => c.Foo1=v,
(c,v) => c.Foo2=v,
(c,v) => c.Foo3=v,
//......
(c,v) => c.Foo50=v,
};
public string Foo1 { set; get; }
public string Foo2 { set; get; }
public string Foo3 { set; get; }
//......
public string Foo50 { set; get; }
private string ReadFoo(int index) {
return readers[index-1](this); //1-based indexing
}
private void SetFoo(int index, string value) {
writers[index-1](this, value); //1-based indexing
}
}