2012-04-29 12 views
13

Cuando implemento una interfaz por primera vez en una clase, quiero que tanto resharper 6 como visual studio 2010 implementen mis propiedades como propiedades implementadas automáticamente y no pongan el valor predeterminado de throw new NonImplementedException() ;. ¿Cómo puedo hacer esto? Por ejemplo:¿Cómo crear propiedades implementadas automáticamente al implementar una interfaz en una clase?

public interface IEmployee 
{ 
// want this to stay just like this when implemented into class 
ID { get; set; } 
} 

public class Employee : IEmployee 
{ 
// I do not want the throw new NonImplemented exception 
// I want it to just appear as an auto implemented property 
// as I defined it in the interface 
public int ID 
     { 
      get 
      { 
       throw new NotImplementedException(); 
      } 
      set 
      { 
       throw new NotImplementedException(); 
      } 
     } 
} 

Debido a que esto sucede todo el tiempo, estoy encontrando a mí mismo tener que refactorizar constantemente y eliminar manualmente los throw new UnImplimented excepciones() y realizar manualmente las propiedades se ajusten automáticamente implementado un dolor ...! Después de todo, lo definí como una propiedad implementada automáticamente en mi interfaz.

Cualquier ayuda o consejo muy apreciado! Gracias.

+0

duplicado Posible de http://stackoverflow.com/questions/3773312/change-the-implement-interface -template –

Respuesta

6

Nota: sus atajos de teclado R # pueden ser diferentes, estoy usando el esquema de teclado Resharper 2.x.

Si se declara la interfaz de la clase y luego usar Alt + Introduzca y selecciona “Implementar miembros”:

Selecting “Implement mebers”

por lo que recibirá la implementación predeterminada, que pasa a ser tirando NotImplementedException, a menos que cambies eso.

Pero si se ignora la propuesta de medidas y en su lugar utiliza Alt + Insertar para abrir el menú Generar, puede seleccionar “Missing miembros”:

Selecting “Missing members”

Esto abrirá Generar ventana, donde puede seleccionar implementar la propiedad (o propiedades) como implementada automáticamente:

Generate window

que va a hacer exactamente lo que quiere:

class Employee : IEmployee 
{ 
    public int Id { get; set; } 
} 
+2

¡Perfecto! Gracias, esto es exactamente lo que estoy buscando. Programo el uso de tdd y estoy constantemente refactorizando/moviendo/agregando/eliminando elementos en mis interfaces, por lo que ajustar manualmente el lanzamiento de la nueva excepción NonImplemented() en toneladas de interfaces implementadas en mis clases siempre fue muy lento. Estoy usando resharper 6 y el diseño del teclado 2.x de resharper para que tus instrucciones funcionen bien. ¡Gracias de nuevo por la respuesta (y también por todos)! – Frekster

7

Después de todo, lo definí como una propiedad implementada automáticamente en mi interfaz.

No, no lo hizo. Lo declaró como una propiedad sin una implementación. Eso es todo lo que puede hacer en una interfaz: solo está diciendo que las clases que implementan la interfaz deben proporcionar las implementaciones concretas de dichas propiedades.

Personalmente, sería cauteloso al tener propiedades modificables dentro de las interfaces. Si esto es algo que "sucede todo el tiempo", me pregunto si está utilizando interfaces donde posiblemente serían más apropiadas las clases abstractas.

En términos de su pregunta exacta: no sé si es posible cambiar la implementación predeterminada, ya sea VS o R # proporciona interfaces, pero me resistiría a hacer esos cambios de todos modos, para ser honesto.

EDITAR: En las opciones de R #, "Generación de código", puede elegir entre lanzar una excepción, devolver un valor predeterminado o dar un código no compilable. Es posible que esto hará lo que quieras. Pruébalo, pero aún así te recomiendo encarecidamente que pienses detenidamente antes de seguir este camino.

+0

FYI, la opción de "valor predeterminado" da como resultado una propiedad expandida que devuelve el valor predeterminado para el tipo y tiene un setter vacío. –

3

Una interfaz no está destinada a especificar cómo se implementarán los métodos, por lo que no hay forma de evitarla con la interfaz. Una solución sería crear una clase base abstracta con las propiedades implementadas automáticamente y heredar esa clase en lugar de implementar directamente la interfaz.

0

Además de la respuesta de Jon ... si realmente quiere cambiar esto (fuera de cuadro) el comportamiento de Visual Studio y crear propiedades de auto cuando implementar la interfaz, puede probar uno de los siguientes ...

  1. uso T4 para la generación de código - http://msdn.microsoft.com/en-us/library/bb126445.aspx

  2. escribir un plugin personalizado para Visual Studio utilizando VS SDK lograr este

0

No está relacionado a esta pregunta por completo, sin embargo, un enfoque diferente cuando se tiene múltiplo de tales propiedades en una interfaz, en lugar de la interfaz se puede tener una clase y refiérase a esa clase como un tipo de devolución en su clase principal. Puedes crear una clase y referirte a esa clase en tu clase principal. Ejemplo

public class Asset 
{ 
    public int AssetTrackingID { get; set; } 

    public Category AssetCategoryInfo { get; set; } 

    public Manufacturer AssetManufacturerInfo { get; set; } 

    public ManufacturerModel AssetModelInfo { get; set; } 

    public Status AssetStatusInfo { get; set; } 

    public EmployeeDetails AssetEmployeeInfo { get; set; } 

    public string AssetNumber { get; set; } 

    public string SerialNumber { get; set; } 

    public DateTime? AcquiredDate { get; set; } 

}

3

Aquí hay una solución rápida que encontré en VS2015. Marque su clase como abstracto e implemente la interfaz de manera abstracta. Esto agrega las propiedades automáticas para usted, luego simplemente reemplaza el "resumen" con "" en su archivo. Luego puede eliminar la palabra clave abstracta de su clase.

1

En el caso de VS2015 que estoy usando una búsqueda y reemplazo macro como solución alternativa:

Find: 
(\r|\n| |\t)+\{(\r|\n| |\t)+get(\r|\n| |\t)+\{(\r|\n| |\t)+throw(\r|\n| |\t)+new(\r|\n| |\t)+NotImplementedException\(\);(\r|\n| |\t)+\}(\r|\n| |\t)+set(\r|\n| |\t)+\{(\r|\n| |\t)+throw(\r|\n| |\t)+new(\r|\n| |\t)+NotImplementedException\(\);(\r|\n| |\t)+\}(\r|\n| |\t)+\} 

replace: 
{get;set;} 
Cuestiones relacionadas