2012-02-23 13 views
5

Escribo algunos patrones personalizados de Resarper para advertirnos sobre algunas construcciones de código que requieren atención. Uno de éstos está reemplazando OnPropertyChanged ("String") con una variante lambda OnPropertyChanged (() => propertyname)Patrones personalizados de Resharper: Ignorar atributos de propiedad

el patrón de búsqueda he definido es:

public $type$ $property$ 
{ 
      get { return $backingfield$; } 
      set 
      { 
       if($backingfield$ != value) { 
        $backingfield$ = value; 
        OnPropertyChanged($String$); 
       } 
      } 
} 

Este patrón está siendo reemplazado con:

public $type$ $property$ 
{ 
     get { return $backingfield$; } 
     set 
     { 
      if($backingfield$ != value) { 
       $backingfield$ = value; 
       OnPropertyChanged(() => $property$); 
      } 
     } 
} 

Problema: al aplicar esto, ReSharper tira a la basura los atributos definidos en la propiedad. Este fragmento:

[MyAttribute] 
public int Test 
{ 
      get { return _Test; } 
      set 
      { 
       if (_Test != value) 
       { 
        _Test = value; 
        OnPropertyChanged("Test"); 
       } 
      } 
} 

es reemplazado con

public int Test 
{ 
      get { return _Test; } 
      set 
      { 
       if (_Test != value) 
       { 
        _Test = value; 
        OnPropertyChanged(() => Test); 
       } 
      } 
} 

¿Cómo puedo conservar los atributos ??

ACTUALIZACIÓN: Adición de un marcador de posición tipo derivado de System.Attribute tanto a buscar y reemplazar patrón corrige parcialmente.

[$Attributes$] 
... 

restante problema es que el marcador de posición Atributo sólo coincide con un atributo, se produce un error en múltiples atributos.

+0

¿Realmente necesita buscar la propiedad completa? Tal vez solo puede buscar 'OnPropertyChanged ($ String $);' y reemplazarlo por 'OnPropertyChanged (() => $ String $);'. – brgerner

+1

Al hacer esto, OnpropertyChanges ("prueba") se reemplaza con OnPropertyChanged ((= = "test"). El marcador de posición de prueba se define como una expresión de tipo cadena. – Yoeri

+0

Tienes razón. Fue mi error. – brgerner

Respuesta

2

Si no puede obtener otra solución, hay una solución.
Utiliza su patrón de búsqueda (sin utilizar el patrón de reemplazo) para mostrar las advertencias. Creo que eso ya funciona
A continuación, crea una Plantilla de sonido envolvente que reemplaza una cadena a () => PropName. Ver la imagen para ver un ejemplo:

enter image description here

entonces usted tiene las advertencias de patrón de búsqueda y la sustitución por una plantilla de envolvente.
El uso es: Si ve la advertencia, seleccione la cadena, presione Ctrl + E, Ctrl + U y seleccione la plantilla Cadena para devolver la propiedad func.

Por supuesto, la selección de cadenas molesta. Pero eso es lo mejor que he descubierto hasta ahora.

+0

+1 Gracias, lo aceptaré cuando los resultados de los foros de la comunidad jetbrains sean negativos :-) – Yoeri

+0

Presenté un problema después de recibir la respuesta @ the jetbrains community forums: Hola Yoeri Me temo que los atributos no pueden ser preservado en este caso. Le invitamos a enviar una solicitud a través de nuestro rastreador de errores: http://youtrack.jetbrains.net/issues/RSRP. ¡Gracias! Andrey Serebryansky Senior Support Engineer JetBrains, Inc – Yoeri

0

Para tales tareas he usado expresiones regulares. VS admite el reemplazo por expresiones regulares, pero a veces se cuelgan o simplemente funcionan muy lento. Sin embargo, en la mayoría de los casos, funcionan.

¿Eso te ayudará?

Upd. No necesita tener todas las propiedades en el grupo de reemplazo, como sugiere brgerner, solo necesita tener una cadena convertida. Por ejemplo, la expresión regular de búsqueda será OnPropertyChanged\("{:w*}"\);, y la cadena de reemplazo será OnPropertyChanged(() => \1);

Sin embargo, no estoy seguro si puede hacer eso en Resharper replace pattern.

+1

No tenemos la intención de reemplazarlo todo. Estamos utilizando configuraciones de Resharper compartidas y solicitamos a los desarrolladores que corrijan las advertencias y errores antes de registrarnos. Gradualmente agregamos nuevos elementos a Resharper para mejorar la consistencia en el código. Reemplazar todo es bueno como acción de una sola vez, las comprobaciones de reafilar también se resaltan cuando se agrega un nuevo código. – Yoeri

+0

No sabía que los patrones de reafilamiento están produciendo advertencias. De cualquier forma, parece que el reafilador no puede usar expresiones regulares para tales cosas, quizás necesite encontrar o escribir un plugin para ello. O tal vez deberías considerar usar StyleCop +. Podría extenderse fácilmente con complementos escritos a mano, que pueden advertir tales cosas – Archeg

+0

Sí, con el análisis de código habilitado en el reafilamiento, puede activar una advertencia, un error, una sugerencia o una sugerencia. Resultan que el código está subrayado y llama la atención del desarrollador. Siempre intentamos registrar archivos sin advertencias ni errores de reactivación. – Yoeri

Cuestiones relacionadas