.NET: przełącznik vs słownik kluczy tekstowych
Mam sytuację, w której mam obiekt biznesowy z około 15 właściwościami różnych typów. Obiekt biznesowy musi również zaimplementować interfejs, który ma następującą metodę:
object GetFieldValue(string FieldName);
Widzę 2 sposoby wdrożenia tej metody:
Użyj instrukcji przełączania:
switch ( FieldName )
{
case "Field1": return this.Field1;
case "Field2": return this.Field2;
// etc.
}
Użyj słownika (SortedDictionary lub HashTable?):
return this.AllFields[FieldName];
Które byłoby bardziej wydajne?
Dodany: Zapomniałem powiedzieć. Ta metoda służy do wyświetlania elementu w siatce. Siatka będzie miała kolumnę dla każdej z tych właściwości. Rutynowo będą w nich siatki z nieco ponad 1000 pozycji. Dlatego martwię się o wydajność.
Dodano 2:
Oto pomysł: podejście hybrydowe. Utwórz słownik statyczny z kluczami będącymi nazwami właściwości i wartościami będącymi indeksami w tablicy. Słownik jest wypełniany tylko raz, podczas uruchamiania aplikacji. Każda instancja obiektu ma tablicę. Tak więc wyszukiwanie będzie wyglądało następująco:
return this.ValueArray[StaticDictionary[FieldName]];
Algorytm wypełniania słownika może wykorzystywać odbicie. Same właściwości zostaną następnie odpowiednio zaimplementowane:
public bool Field1
{
get
{
object o = this.ValueArray[StaticDictionary["Field1"]];
return o == null ? false : (bool)o;
}
set
{
this.ValueArray[StaticDictionary["Field1"]] = value;
}
}
Czy ktokolwiek widzi w tym jakieś problemy?
Można go również zrobić o krok dalej, a ValueArray / StaticDictionary można umieścić w oddzielnym typie ogólnymValueCollection<T>
, gdzieT
określi typ odbicia. ValueCollection obsługuje również przypadek, gdy nie ustawiono jeszcze żadnej wartości. Właściwości można następnie zapisać po prostu jako:
public bool Field1
{
get
{
return (bool)this.Values["Field1"];
}
set
{
this.Values["Field1"] = value;
}
}
I w końcu zaczynam się zastanawiać, czy prosta instrukcja zmiany może nie być zarówno szybsza, jak i łatwiejsza do utrzymania ....