Quiero construir un método que acepte un param de cadena, y un objeto del cual me gustaría devolver un miembro en particular basado en el param. Por lo tanto, el método más fácil es construir una sentencia switch:declaración de interruptor indexado, o equivalente? .net, C#
public GetMemberByName(MyObject myobj, string name)
{
switch(name){
case "PropOne": return myobj.prop1;
case "PropTwo": return myobj.prop2;
}
}
Esto funciona bien, pero puede terminar con una lista bastante grande ... así que estaba ansioso por ver si hay una manera, sin necesidad de escribir un montón de estructuras if-else anidadas, para lograr esto de forma indexada, de modo que el campo coincidente se encuentre por índice en lugar de caer a través de un interruptor hasta que se encuentre una coincidencia.
Consideré usar un Dictionary<string, something>
para dar acceso rápido a las cadenas correspondientes (como el miembro clave) pero como deseo acceder a un miembro de un objeto pasado, no estoy seguro de cómo se podría lograr esto .
Estoy tratando específicamente de evitar la reflexión, etc. para tener una implementación muy rápida. Probablemente usaré generación de código, por lo que la solución no necesita ser pequeña/estricta, etc.
Originalmente estaba construyendo un diccionario de pero cada objeto lo estaba inicializando. Así que comencé a mover esto a un único método que puede buscar los valores basados en las teclas: una declaración de cambio. Pero como ya no estoy indexado, me temo que las búsquedas continuas que invocan este método serían lentas.
SO: Estoy buscando una manera de combinar el rendimiento de una búsqueda indexada/hash (como usa el diccionario) con el retorno de propiedades particulares de un objeto pasado. Probablemente pondré esto en un método estático dentro de cada clase para la que se usa.
Dado que myobj parece ser muy específico (a diferencia de un simple 'objeto'), ¿no es myobj.Property enough en lugar de GetMemberByName (myobj," Property ")? – Humberto
Solo un pensamiento, interpreté mal tu intención basándome en el título. El ejemplo lo aclaró para mí. Parece que la pregunta se parece más a "¿Cómo puedo acceder a una propiedad de un objeto por nombre", ¿verdad? –
¿Por qué 'name' es una cadena? ¿Esto es algo que ingresa un usuario? ¿Es de un archivo? ¿Hay alguna razón por la cual no es un 'enum'? –