.NET: переключение против словаря для строковых ключей
У меня возникла ситуация, когда у меня есть бизнес-объект с примерно 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
указал бы тип для отражения. ValueCollection также будет обрабатывать случай, когда еще не установлено значение. Свойства могут тогда быть написаны просто как:
public bool Field1
{
get
{
return (bool)this.Values["Field1"];
}
set
{
this.Values["Field1"] = value;
}
}
И, в конце концов, яЯ снова начинаю задумываться, не может ли простой оператор switch быть быстрее и проще в обслуживании ....