У меня есть ситуация, когда у меня есть бизнес-объект с примерно 15 свойствами различных типов. Бизнес-объект также должен реализовать интерфейс, который имеет следующий метод:
object GetFieldValue(string FieldName);
Я вижу 2 способа реализации этого метода:
Используйте оператор 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 быть быстрее и проще в обслуживании ...