.net - para - usar atributo alt en html
Crear un atributo para romper la compilaciĆ³n (11)
Lanza una excepción personalizada y prueba de unidad como un paso posterior a la compilación
OK, este tipo de seguimiento 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 atributo Obsoleto ("razón", verdadero) , pero sin identificar falsamente el código obsoleto.
Para aclarar : no quiero que rompa la compilación en CUALQUIER prensa F6 (compilación), solo quiero que rompa la compilación si un método decorado con el atributo se llama en otro lugar en el código. Como dije, similar a obsoleto, pero no es lo mismo.
Sé que no estoy solo en esto, ya que otros usuarios quieren usarlo por otros motivos . Nunca antes he creado atributos personalizados, ¡así que todo es nuevo para mí!
Respondiendo 4 años después :)
Tenía la misma pregunta si había una alternativa a Obsoleto.
Por lo que recuerdo (videos de channel9) hace un momento Microsoft dijo que está trabajando para dar a los desarrolladores acceso a algo como una API de compilación en algún momento, así que en el futuro es posible escribir un "complemento" de compilación 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 ser llamado en algún otro lugar en el código, etc.
Lo cual en realidad sería genial cuando lo pienses. También me recuerda que también debería intentar leer sobre el progreso de ese compilador en el que MS está trabajando ...
¿Por qué no inventas algo? Un atributo desconocido seguramente rompería la construcción.
[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
Cree una regla FxCop y agregue FxCop a su compilación de integración para verificar esto.
Recibirás advertencias, en lugar de una versión fallada. Los atributos ''ejecutan'' en tiempo de reflexión en lugar de tiempo de compilación.
Alternativamente (y esto es bastante desagradable) ponga una directiva de compilación alrededor del método que no quiere que se llame. Entonces su código se romperá si lo llama, pero puede configurar una versión que aprueba la directiva del compilador correcta y no lo hace.
Creo que la única manera a prueba de tontos sería ampliar el Visual Studio (a través de VSIP) y suscribirse al evento correcto (tal vez en la clase EnvDTE.BuildEvents), y verificar el código para el uso del constructor, y cancelar la compilación si detectarlo
Te sugiero que uses la directiva #error.
Otro atributo bastante desconocido que podría hacer el trabajo es el atributo condicional (dependiendo de lo que intentas evitar)
[Conditional("CONDITION")]
public static void MiMethod(int a, string msg)
que eliminará la invocación del método del código IL si se define "MY_CONDITION".
Tendré que estar de acuerdo con Greg: crear un atributo para ello.
Y si habla en serio, tal vez encuentre una forma de averiguar si el constructor está siendo accedido por algo que no sea XMLSerializer y lanzar una excepción si es así.
Todo esto está empezando a parecerse un poco al TDWTF de ayer . :-)
Creo que esta sería una excelente solicitud de funciones para Microsoft: cree un atributo de clase base abstracto CompilerExecutedAttribute
que el compilador procese de alguna manera o que pueda influir en el proceso de compilación. Entonces podríamos heredar de este atributo e implementar diferentes operaciones, por ejemplo, emitir un error o una advertencia.
Si esto es para la serialización de XML y NHibernate, donde quiere que se pueda acceder al constructor sin parámetros (como es el caso en el ejemplo al que se hace referencia), utilice un constructor sin parámetros privado o protegido para la serialización o un constructor protegido para NHibernate. Con la versión protegida, te estás abriendo a las clases heredadas para poder llamar a ese código.
Si no desea que el código invoque un método, no lo haga accesible.
EDITAR: Para responder quizás a la pregunta más profunda, AFAIK el compilador solo conoce tres atributos: Obsoleto, Condicional y AttributeUsage . Agregar manejo especial para otros atributos requeriría modificar el compilador.