Hay numerosas razones por las cuales la reflexión miembro en tiempo de compilación todavía no se ha implementado en C# - pero la mayoría de ellos básicamente se reducen a opportunity cost - hay muchos otros idiomas características y mejoras que ofrecen más beneficios a más usuarios. También existe la consideración de que una sintaxis infoof
podría ser complicada, confusa y, en última instancia, menos poderosa que el uso de reflexión basada en cadenas. Tampoco sería un reemplazo completo para la reflexión ya que en muchos casos los metadatos que se manipulan no se conocen en tiempo de compilación.
Sin embargo, no todo está perdido, hay una serie de trucos que puede emplear para realizar una reflexión ligeramente más segura que aprovecha las capacidades del lenguaje C#. Por ejemplo, podemos aprovechar las expresiones lambda y los árboles de expresión para extraer la información de MemberInfo.Un ejemplo sencillo es:
public static class MethodExt {
static MethodInfo MemberInfo(Action d) {
return d.Method;
}
// other overloads ...
}
que funciona cuando se pasa de un delegado de acción (no anónimo):
MethodInfo mi = MethodExt.MemberInfo(Object.ToString);
Una implementación de la anterior utilizando árboles de expresión puede más robusto y flexible, pero también sustancialmente más complicado. Se podría usar para representar el acceso a miembros y propiedades, indexadores, etc.
El problema principal con todos estos enfoques "sofisticados" es que confunden a los desarrolladores que están acostumbrados a ver el código de reflexión tradicional. Tampoco pueden manejar todos los casos, lo que a menudo resulta en una desafortunada mezcla de código de reflexión tradicional y código de árbol de expresión elegante. Personalmente, si bien estas técnicas son interesantes e ingeniosas, probablemente sea mejor evitarlas en el código de producción.
Probablemente podría implementarse fácilmente. Yo también quería algo como esto. Tenga en cuenta que se requeriría una sintaxis alternativa para los métodos, ya que pueden estar sobrecargados, por lo que especificar el nombre solo no sería suficiente en ese caso. – cdhowie
Puede crear algo similar utilizando Expression Trees; esto funciona particularmente bien para propiedades y campos. –
@Bryant ¿tiene un ejemplo o un enlace? – ja72