Tengo una situación en la que tengo un objeto comercial con aproximadamente 15 propiedades de diferentes tipos. El objeto de negocio también tiene que implementar una interfaz que tiene el siguiente método:.NET: switch vs dictionary para claves de cadena
object GetFieldValue(string FieldName);
puedo ver 2 maneras de implementar este método:
Uso de una sentencia switch:
switch (FieldName)
{
case "Field1": return this.Field1;
case "Field2": return this.Field2;
// etc.
}
Utilice un diccionario (SortedDictionary o HashTable?):
return this.AllFields[FieldName];
que sería más eficiente?
Agregado: Olvidó decir. Este método es para mostrar el artículo en una grilla. La grilla tendrá una columna para cada una de estas propiedades. Habitualmente habrá cuadrículas con un poco más de 1000 elementos en ellas. Por eso me preocupa el rendimiento.
Agregado 2:
He aquí una idea: un enfoque híbrido. Cree un diccionario estático con claves que sean nombres de propiedad y valores que sean índices en matriz. El diccionario se completa solo una vez, al inicio de la aplicación. Cada instancia de objeto tiene una matriz. Por lo tanto, la búsqueda sería como la siguiente:
return this.ValueArray[StaticDictionary[FieldName]];
El algoritmo de relleno del diccionario puede usar la reflexión. Las propiedades en sí entonces se ejecutarán en consecuencia:
public bool Field1
{
get
{
object o = this.ValueArray[StaticDictionary["Field1"]];
return o == null ? false : (bool)o;
}
set
{
this.ValueArray[StaticDictionary["Field1"]] = value;
}
}
Puede alguien ver ningún problema con esto?
También se puede tomar un paso más y ValueArray/StaticDictionary se puede colocar en un tipo genérico separado ValueCollection<T>
, donde T
especificaría el tipo de reflejo. ValueCollection también manejará el caso cuando aún no se haya establecido ningún valor. Propiedades podrían entonces ser escritas simplemente como:
public bool Field1
{
get
{
return (bool)this.Values["Field1"];
}
set
{
this.Values["Field1"] = value;
}
}
Y al final, estoy empezando a preguntarse de nuevo, si una declaración simple cambio podría no ser más rápido y más fácil de mantener ....
¿Hay algún motivo por el que no vincule todo el objeto a la cuadrícula como un datarow? –
A decir verdad, es la cosa de DevExpress TreeList. Es como un híbrido treeview/gridview. Entonces los datos tienen que ser jerárquicos. Y la interfaz está ahí para que TreeList comprenda la jerarquía 'n cosas. Probablemente también podría traducirlo todo a una DataTable (también puede vincularse a eso), pero luego me resultará más cómodo trabajar con ella. –
Quiero decir, también haré otras cosas con esta estructura de datos, no solo la mostraré en la grilla. –