es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Símbolo de definición de preprocesador de C# basado en variable de entorno.

Tengo cierta lógica que es así:

#define MYVAR
...
#if MYVAR
[Attribute1]
#else
[Attribute2]
#endif

Quiero poder cambiar los atributos aplicados a un método basado en una variable de entorno. Por ejemplo, si la variable de entorno MYVAR está configurada, entonces definir el símbolo ‘MYVAR’ y viceversa.

Honestamente, no sé si es posible. Si no lo es, ¿alguna idea de cómo superar esto? Por supuesto, puedo agregar esto en el método mismo, la verificación de la variable de entorno, pero necesito los atributos por la ejecución de la reflexión.
Puedo crear un MyAttribute(int mode), pero no puedo agregar una lógica en su constructor para extraer una variable de entorno, porque debe ser una expresión constante.

Posibles soluciones:
– Como sugiere el primer comentario, puedo leer la variable de entorno en el atributo personalizado. Aún así, quedaría algo de reflexión desagradable por hacer.

  • Debido a que estoy trabajando en Linux con comandos dotnet, en realidad puedo combinar mi comando de compilación con un paso previo de comando sed y agregar un marcador ficticio {{define_myvar}} en la parte superior del archivo .cs y reemplazarlo con una cadena vacía o la cadena completa basada en las variables de entorno. No hay reflexión aquí, pero no es muy elegante.
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en c#, atributos y preprocesadores, aquí hay algunas posibles soluciones al problema de cambiar atributos basados en una variable de entorno:

    1. Leer la variable de entorno en el atributo personalizado: Una posible solución es crear un atributo personalizado y leer la variable de entorno dentro de él. Esto te permitiría cambiar el atributo aplicado a un método según el valor de la variable. Sin embargo, este enfoque requeriría cierta reflexión, lo cual puede no ser lo ideal.
    2. Usar un comando preliminar para reemplazar un marcador ficticio en el código: Otra opción es utilizar un comando preliminar en tu proceso de compilación para reemplazar un marcador ficticio en el código con una cadena vacía o la cadena completa, según el valor de la variable de entorno. Esto no requeriría reflexión, pero puede que no sea la solución más elegante.

    En última instancia, la mejor solución dependerá de tus requisitos y limitaciones específicas, pero estas son dos opciones potenciales a considerar.

Comments are closed.