Pregunta

Bien, esto es una continuación de mi pregunta anterior.

Lo que realmente me gustaría hacer es crear algún tipo de atributo que me permita decorar un método que romper la construcción.Muy parecido al Obsoleto("razón", verdadero) atributo, pero sin identificar falsamente código obsoleto.

Para aclarar:No quiero que rompa la construcción. CUALQUIER Presione F6 (compilación), solo quiero que interrumpa la compilación si se llama a un método decorado con el atributo en algún otro lugar del código.Como dije, similar hasta obsoleto, pero no igual.

Sé que no estoy solo en esto, ya que otros usuarios quieren usarlo por otros motivos.Nunca antes había creado atributos personalizados, ¡así que todo es nuevo para mí!

¿Fue útil?

Solución

Si esto es para serialización XML y NHibernate, donde desea que se pueda acceder al constructor sin parámetros (como es el caso en el ejemplo al que hizo referencia), luego use un constructor sin parámetros privado o protegido para la serialización, o un constructor protegido para NHibernate.Con la versión protegida, se abre a que las clases heredadas puedan llamar a ese código.

Si no desea que el código llame a un método, no lo haga accesible.

EDITAR:Quizás para responder a la pregunta más profunda, AFAIK, el compilador solo conoce tres atributos: Uso obsoleto, condicional y de atributos.Agregar un manejo especial para otros atributos requeriría modificar el compilador.

Otros consejos

Creo que esta sería una excelente solicitud de función para Microsoft:Crear un atributo de clase base abstracto CompilerExecutedAttribute que el compilador procesa de alguna manera o que puede influir en el proceso de compilación.Entonces podríamos heredar de este atributo e implementar diferentes operaciones, p.e.emitir un error o una advertencia.

Si considera que una advertencia (que es lo que arroja [Obsoleto]) interrumpe la compilación, simplemente use el #advertencia directiva del compilador.

Editar:Nunca lo he usado, pero #error también está disponible.

Creo que la única forma infalible sería extender Visual Studio (a través de VSIP) y suscribirse al evento correcto (tal vez en la clase EnvDTE.BuildEvents), verificar su código para ver el uso del constructor y cancelar la compilación si detectarlo.

Todo esto empieza a sonar un poco como TDWTF de ayer. :-)

Tendré que estar de acuerdo con Greg:crear un atributo para ello.

Y si habla realmente en serio, tal vez encuentre una manera de averiguar si otro dispositivo que no sea XMLSerializer accede al constructor y, si es así, generar una excepción.

Te sugiero que uses la directiva #error.

Otro atributo bastante desconocido que podría funcionar es el atributo condicional (dependiendo de lo que estés tratando de lograr)

[Conditional("CONDITION")] 
public static void MiMethod(int a, string msg)

lo que eliminará la invocación del método del propio código IL si se define "MY_CONDITION".

Cree una regla FxCop y agregue FxCop a su compilación de integración para verificar esto.

Recibirá advertencias, en lugar de una compilación fallida.Los atributos se "ejecutan" en el momento de la reflexión en lugar del tiempo de creación.

Alternativamente (y esto es bastante desagradable) coloque una directiva del compilador alrededor del método que no desea que se llame.Entonces su código se romperá si lo llama, pero puede configurar una compilación que pase la directiva del compilador correcta y no lo haga.

Lanzar una excepción personalizada y una prueba unitaria como paso posterior a la compilación

Respondiendo 4 años después :)

Tenía la misma pregunta si hubiera una alternativa a Obsoleto.

Por lo que recuerdo (videos del canal 9), hace un momento Microsoft declaró que está trabajando para brindar a los desarrolladores acceso a algo así como una API de compilador en algún momento, por lo que en el futuro es concebible que se pueda escribir un "complemento" de compilador que permita para decorar métodos con su propio atributo personalizado y decirle al compilador que cancele si parece que el código decorado podría estar siendo llamado en algún otro lugar del código, etc.

Lo que en realidad sería genial si lo piensas.También me recuerda que también debería intentar leer sobre el progreso de la API del compilador en la que MS está trabajando...

¿Por qué no inventar algo?Un atributo desconocido seguramente rompería la construcción.

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top