2012-04-29 11 views
13

Kiedy zaimplementuję interfejs po raz pierwszy w klasie, chcę albo resharper 6 albo wizualne studio 2010, aby zaimplementować moje właściwości jako właściwości zaimplementowane automatycznie i nie wstawić domyślnej wartości throw new NonImplementedException() ;. Jak mogę to zrobić? Na przykład:Jak tworzyć automatycznie zaimplementowane właściwości podczas implementowania interfejsu w klasie?

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(); 
      } 
     } 
} 

Bo to dzieje się cały czas, ja znajduję się konieczności ciągłego byłaby i ręcznie usunąć te rzucają nowe UnImplimented (wyjątki) i ręcznie wprowadzać właściwości być wdrożone auto ... ból! W końcu zdefiniowałem to jako właściwość zaimplementowaną automatycznie w moim interfejsie.

Każda pomoc lub porada doceniona! Dzięki.

+0

Możliwy duplikat http://stackoverflow.com/questions/3773312/change-the-implement-interface -template –

Odpowiedz

6

Uwaga: skróty klawiszowe R # mogą się różnić, używam schematu klawiatury Resharper 2.x.

Jeśli zadeklarujesz interfejs od klasy, a następnie użyć Alt + Wprowadź i wybierz „Wdrożenie członków”:

Selecting “Implement mebers”

Następnie otrzymasz wdrożenie domyślny, który dzieje się rzucanie NotImplementedException, chyba że to zmienisz.

Ale jeśli zignorujesz sugerowanego sposobu działania i zamiast używać Alt + Insert aby otworzyć menu tworzenia, można wybrać „Brak członków”:

Selecting “Missing members”

Zostanie otwarte Generowanie okno, w którym można wybrać zaimplementowanie właściwości (lub właściwości) jako automatycznie zaimplementowanej:

Generate window

Że zrobi dokładnie to, co chcesz:

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

Idealny! Dziękuję, to było dokładnie to, czego szukam. Programuję przy użyciu tdd i stale aktualizuję/przesuwanie/dodawanie/usuwanie elementów w moich interfejsach, więc ręczne dostosowywanie wyrzucenia nowego wyjątku NonImplemented() w tonach interfejsów zaimplementowanych w moich klasach było zawsze tak czasochłonne. Korzystam z układu resharper 6 i układu klawiatury resharpera 2.x, więc instrukcje działały poprawnie. Jeszcze raz dziękuję za odpowiedź (i za wszystkie)! – Frekster

7

W końcu zdefiniowałem to jako właściwość zaimplementowaną automatycznie w moim interfejsie.

Nie, nie zrobiłeś. Użytkownik zadeklarował go jako własność bez implementacji. To wszystko, co możesz zrobić może w interfejsie: mówisz tylko, że klasy implementujące interfejs muszą zapewniać konkretne implementacje takich właściwości.

Osobiście uważam, że zbyt wiele zapisywalnych właściwości w interfejsie - jeśli jest to coś, co można znaleźć "dzieje się cały czas" Zastanawiam się, czy używasz interfejsów, gdzie ewentualnie bardziej abstrakcyjne klasy byłyby bardziej odpowiednie.

Pod względem dokładnego pytania: nie wiem, czy można zmienić domyślną implementację: VS lub R # zapewnia interfejsy - ale w każdym razie przeciwstawiałbym się wprowadzaniu tych zmian, szczerze mówiąc.

EDYCJA: Pod opcjami R #, "Generowanie kodu", możesz wybrać między wyrzucaniem wyjątku, zwracaniem wartości domyślnej lub nadawaniem nieskompilowanego kodu. To jest możliwe, że zrobi to, co chcesz. Daj sobie szansę, ale nadal usilnie nalegam, żebyś przemyślał ostrożnie, zanim podążysz tą ścieżką.

+0

FYI, opcja "wartość domyślna" powoduje rozwinięcie właściwości, która zwraca wartość domyślną dla typu i ma ustawiony pusty setter. –

3

Interfejs nie ma na celu określenia, w jaki sposób zostaną zastosowane metody, więc nie ma możliwości obejścia go za pomocą interfejsu. Jednym z rozwiązań byłoby stworzenie abstrakcyjnej klasy bazowej z automatycznie zaimplementowanymi właściwościami i dziedziczenie tej klasy zamiast bezpośredniego implementowania interfejsu.

0

Oprócz odpowiedzi Jona ... jeśli naprawdę chcesz to zmienić (z pudełkiem) zachowanie Visual Studio i tworzenie właściwości auto podczas wdrożenia interfejs, można spróbować jednego z następujących ...

  1. Zastosowanie T4 do generowania kodu - http://msdn.microsoft.com/en-us/library/bb126445.aspx

  2. Napisz własny plugin do Visual Studio przy użyciu VS SDK osiągnąć ten

0

To nie jest związane z tym pytaniem całkowicie jednak innego podejścia, gdy masz wiele takich właściwości w interfejsie, zamiast interfejsu można mieć klasę odnoszą się do tej klasy jako typ zwrotu w głównej klasie. Możesz stworzyć klasę i odnieść się do tej klasy w swojej głównej klasie. Przykład

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

Oto szybkie obejście, które znalazłem w VS2015. Oznacz swoją klasę jako abstrakcyjną, a następnie zastosuj interfejs w sposób abstrakcyjny. Dodaje to właściwości automatyczne, a następnie zastępujesz "streszczenie" przez "" w swoim pliku. Następnie możesz usunąć słowo kluczowe ze swojej klasy.

1

W przypadku VS2015 używam znaleźć i zastąpić makro jako obejście:

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;} 
Powiązane problemy