typeparam tag cref c# .net compile-time strong-typing magic-string

cref - summary tag in c#



Tiempo de compilación de reflexión en C# (4)

Con frecuencia escribo código C # que tiene que usar cadenas mágicas para expresar nombres de propiedades. Todo el mundo conoce los problemas con las cuerdas mágicas. Son muy difíciles de refactorizar, no tienen tiempo de compilación y, a menudo, conducen a problemas difíciles de diagnosticar. Sin embargo, C # / .NET los utiliza en todas partes para representar los nombres de propiedad / clase / método.

Este problema ha persistido durante años y años, y la única solución viable actualmente es utilizar un árbol de expresiones que luego se analiza en tiempo de ejecución para el nombre de la propiedad. Esto le proporciona una verificación satisfactoria en tiempo de compilación, pero complica el código (que requiere parámetros de tipo Expresión) e incurre en un costo en tiempo de ejecución.

¿Alguien sabe si alguna vez ha habido una consideración de características para C # / .NET para agregar una reflexión en tiempo de compilación para superar este problema generalizado?

Parece que sería una adición fácil de hacer, sería un cambio ininterrumpido y beneficiaría enormemente a muchos desarrolladores. El operador typeof () ya realiza una forma de reflexión en tiempo de compilación, por lo que parece que un operador nameof () (o algo similar) sería muy complementario.

Además, ¿alguien sabe de posibles problemas con esta característica?

Gracias por la ayuda.


Sin embargo, C # / .NET los utiliza en todas partes para representar los nombres de propiedad / clase / método.

En primer lugar: no estoy de acuerdo. Hay ciertos marcos (WebForms, por ejemplo) que utilizan cadenas mágicas en todo el lugar, pero las bibliotecas base para C # y .NET tienden a evitar esas cosas notablemente bien.

En segundo lugar: en muchos casos en que se usan cadenas mágicas, ReSharper puede reconocer errores. Esto puede ayudar bastante.

Finalmente: lo que está solicitando puede ser posible a través del Compilador Roslyn, que promete proporcionar "Compilar como un servicio".


Estaba teniendo un problema similar. Solo recientemente descubrí que .NET Framework 4.5 tiene una característica llamada los atributos de Información del llamante . Al usar estos, puede obtener información sobre la persona que llama a un método en tiempo de compilación. Puede obtener la ruta del archivo de código fuente, el número de línea en el código fuente y el nombre de miembro de la persona que llama.

public void DoProcessing() { TraceMessage("Something happened."); } public void TraceMessage(string message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) { Trace.WriteLine("message: " + message); Trace.WriteLine("member name: " + memberName); Trace.WriteLine("source file path: " + sourceFilePath); Trace.WriteLine("source line number: " + sourceLineNumber); }


Directamente desde la fuente : esta es una publicación de blog de un diseñador de lenguaje C #, y el "Usuario" en esta publicación pregunta sobre las mismas preguntas que usted y recibe respuesta. El autor dice que sería necesario especificar una sintaxis para cada elemento de metadatos que desea solicitar y no es trivial, es decir. ¿Qué sobrecarga desea, si quiere el método "info-of" y el método está sobrecargado? ¿Qué pasa si hay implementaciones genéricas y de interfaces explícitas involucradas? Y así. Resulta que, si bien no se consideró digno de implementación en 2009 debido a esas razones, lo obtendremos en C # 6 en 2015; consulte las Notas de diseño de lenguaje C # del 9 de julio de 2014 .


En C # 6.0, se está agregando un nuevo operador, nameof , que le permitirá obtener los nombres de propiedades, clases, campos, eventos y variables en el momento de la compilación.

Enlace a las notas de diseño.

¡No más reflexión para la información que el compilador ya conoce en el momento del diseño!