Creo que para entender la necesidad de reflexión en .NET, necesitamos volver a .NET. Después de todo, los lenguajes modernos como Java y C# no tienen un historial BF (antes de la reflexión).
C++ podría decirse que ha tenido la mayor influencia en C# y Java. Pero C++ originalmente no tenía reflejo y codificamos sin él y logramos salir adelante. Ocasionalmente teníamos un puntero de vacío y usábamos un molde para forzarlo en el tipo que quisiéramos. El problema aquí es que el elenco podría fallar con consecuencias terribles:
double CalculateSize(void* rectangle) {
return ((Rect*)rectangle)->getWidth() * ((Rect*)rectangle)->getHeight());
}
Ahora hay un montón de argumentos por los que no debería haber codificados a ti mismo en este problema en primer lugar. Pero el problema no es muy diferente de .NET 1.1 con C# cuando no teníamos genéricos:
Hashtable shapes = new Hashtable();
....
double CalculateSize(object shape) {
return ((Rect)shape).Width * ((Rect)shape).Height;
}
Sin embargo, cuando el ejemplo de C# no lo hace con una excepción más que un volcado de memoria potencial.
Cuando se agregó la reflexión a C++ (conocida como Identificación del tipo de tiempo de ejecución o RTTI), se debatió acaloradamente.En el libro de Stroustrup El Diseño y Evolución de C++, que enumera los siguientes argumentos en contra de RTTI, en el que algunas personas:
Declared the support unnecessary
Declared the new style inherently evil ("against the spirit of C++")
Deemed it too expensive
Thought it too complicated and confusing
Saw it as the beginning of an avalanche of new features
Pero nos permitió para consultar el tipo de objetos o características de objetos. Por ejemplo (usando C#)
Hashtable shapes = new Hashtable();
....
double CalculateSize(object shape) {
if(shape is Rect) {
return ((Rect)shape).Width * ((Rect)shape).Height;
}
else if(shape is Circle) {
return Math.Power(((Circle)shape).Radius, 2.0) * Math.PI;
}
}
Por supuesto, con la planificación adecuada este ejemplo nunca debería tener que ocurrir.
Así, las situaciones del mundo real, donde he necesitado que incluyen:
- objetos de Acceso a la memoria compartida, todo lo que tengo es un puntero y tengo que decidir qué hacer con él.
- cargando dinámicamente ensamblajes, piense en NUnit donde carga cada ensamblaje y utiliza la reflexión para determinar qué clases son accesorios de prueba.
- Tener un conjunto mixto de objetos en un Hashtable y querer procesarlos de manera diferente en un enumerador.
- Muchos otros ...
Por lo tanto, me gustaría ir tan lejos como para argumentar que la reflexión no ha permitido la posibilidad de hacer algo que no se podía hacer antes. Sin embargo, hace que algunos tipos de problemas sean más fáciles de codificar, más claros para el lector, más cortos para escribir, etc.
Por supuesto, esa es solo mi opinión, podría estar equivocado.
@Praveen: esta es una pregunta bastante amplia. ¿Puedes ser mas específico? –
Actualmente no es una pregunta real: imposible de responder. Tal vez si se expandió con lo que está tratando de determinar. – Richard
¿Es esta tarea? – erikkallen