У меня есть ситуация, когда у меня есть бизнес-объект с 15 свойствами разных типов. Бизнес-объект также должен реализовать интерфейс, который имеет следующий метод:
object GetFieldValue(string FieldName);
Я вижу два способа реализации этого метода:
Используйте оператор switch:
switch ( FieldName )
{
case "Field1": return this.Field1;
case "Field2": return this.Field2;
// etc.
}
Используйте словарь (SortedDictionary или HashTable?):
return this.AllFields[FieldName];
Что было бы более эффективным?
Добавлено: Забыл сказать. Этот метод предназначен для отображения элемента в сетке. У сетки будет столбец для каждого из этих свойств. Обычно в них будут решетки с чуть более 1000 предметов. Вот почему меня беспокоит производительность.
Добавлен 2:
Вот идея: гибридный подход. Сделайте статический словарь с ключами, являющимися именами свойств, и значениями являются индексы в массиве. Словарь заполняется только один раз, при запуске приложения. Каждый экземпляр объекта имеет массив. Таким образом, поиск будет выглядеть следующим образом:
return this.ValueArray[StaticDictionary[FieldName]];
Алгоритм заполнения словаря может использовать отражение. Затем сами свойства будут реализованы:
public bool Field1
{
get
{
object o = this.ValueArray[StaticDictionary["Field1"]];
return o == null ? false : (bool)o;
}
set
{
this.ValueArray[StaticDictionary["Field1"]] = value;
}
}
Может ли кто-нибудь увидеть какие-либо проблемы с этим?
Также можно сделать еще один шаг, а ValueArray/StaticDictionary можно поместить в отдельный общий тип ValueCollection<T>
, где T
будет указывать тип для отражения. ValueCollection также будет обрабатывать случай, когда значение еще не установлено. Затем свойства можно было бы написать просто так:
public bool Field1
{
get
{
return (bool)this.Values["Field1"];
}
set
{
this.Values["Field1"] = value;
}
}
И в конце я снова начинаю удивляться, если простой оператор switch может быть не быстрее и проще поддерживать....