2016-02-25 23 views
12

Od niedawna używam generowania kodu, zwykle w połączeniu z klasami częściowymi. Zasadniczo konfiguracja jest następująca:Podaj wskazówkę do technologii IntelliSense, której częściowa klasa nie powinna być modyfikowana.

  • Częściowa klasa zawierająca wygenerowany kod. Niektóre z tego kodu wywołają metody częściowe. Kod jest ponownie generowany dużo czasu. Generator kodu jest w niektórych przypadkach narzędziem niestandardowym.
  • Metody częściowe są wdrażane ręcznie w oddzielnym pliku.

Problem polega na tym, że gdy używam funkcji Intellisense takich jak "generuj metodę", są one z jakiegoś powodu generowane w pliku zawierającym wygenerowany kod. Oczywiście, że tego nie chcę.

Moje pytanie brzmi: czy można wygenerować wskazówkę, która mówi IntelliSense, że nie powinna dotykać niektórych plików "cs" (ale zamiast tego drugiej klasy częściowej)?


Aktualizacja

Z perspektywy czasu powinienem zaznaczyć, że używam narzędzia niestandardowe do generowania kodu. To nie jest EF ani prosta transformacja; w generowaniu kodu jest sporo logiki. Ponadto generuje kompletny obszar nazw i strukturę klas z klasami częściowymi. "Przestrzeń nazw root" znajduje się poprzez wyodrębnienie jej z pliku csproj, a następnie użycie struktury folderów do określenia bezwzględnej przestrzeni nazw (jest to podobne do sposobu, w jaki robi to Linq2sql).

Odpowiedź sugerowana przez xanatos (dziękuje!) Działa: intellisense sortuje swoją operację na nazwie, następnie sortuje alfabetycznie według nazwy, a następnie wybiera pierwszy element na liście. Oznacza to, że możesz wygenerować zzzz.foo.cs, który (choć nieco brzydki) będzie działał dobrze. Właśnie przeprowadziłem pewne eksperymenty i odkryłem, że funkcja find all references zwraca kolejność, której wydaje się używać VS. Jak się okazuje, działa to tak:

Załóżmy, że masz niestandardowe narzędzie, które działa na nazwie pliku foo.bar i przekształca ją w foo.cs. Niestandardowe narzędzie wygeneruje zawartość jako ciąg i przekaże ją z powrotem do Visual Studio (tak po prostu działają narzędzia niestandardowe ...). Wynik będzie w pliku o nazwie foo.cs.

Teraz, byłem dość zaskoczony stwierdził, że Intellisense robi nie rodzaj go jako foo.cs ale raczej jako foo.bar\foo.cs. Innymi słowy: niezależnie od tego, jak nazywasz wyjście "cs" w swoim niestandardowym narzędziu, musisz zmienić nazwę pliku podstawowego foo.bar na coś podobnego do zoo.bar.

Choć może to być obejście problemu, jestem niezdecydowany, aby zaakceptować to jako odpowiedź, ponieważ musiałbym nadawać plikom w moim projekcie dziwne nazwy (nazwy mają znaczenie ...). Ponadto niektóre z moich narzędzi niestandardowych są zależne od ich nazw plików, więc również zostaną zerwane ...

Dlatego wciąż jestem otwarty na sugestie, jak to naprawić.

Odpowiedz

2

Zakładając, że mówisz o EF, zawsze zmieniam plik szablonu (.tt), więc nazwa pliku automatycznie generowanego to [classname] .model.cs. Oznacza to, że mój plik częściowy, który zgodnie z konwencją nazywa się [classname] .cs, jest alfabetycznie pierwszy i zawsze wydaje się być wybrany do automatycznego generowania.

Wszystko co musisz zrobić, to znaleźć/wymienić wszystkich:

fileManager.StartNewFile(entity.Name + ".cs"); 

Z:

fileManager.StartNewFile(entity.Name + ".model.cs"); 

Nie powinno być 3.

ten ma także inne korzyści, takie jak auto generowanych plików są wyraźnie oznaczone w nazwie pliku.

Nadal nie mam pojęcia, dlaczego nie zrobili tego w pierwszej kolejności.

Jeśli nie mówisz o EF, to ta sama sztuczka używania nazwy pliku do zamówienia powinna działać.

3

Z prostego testu, który zrobiłem w VS2013, wydaje się, że Visual Studio 2013 dodaje metodę do "pierwszego" pliku, który znajduje w Eksploratorze rozwiązań. Więc możesz po prostu dodać .something.cs do swojej nazwy pliku, np. MyClass.generated.cs vs MyClass.cs. Należy pamiętać, że VS2013 wydaje się używać "pełnej ścieżki", z porządkowaniem ścieżek na podstawie nazwy. Więc:

Z \ MyClass.cs

przychodzi po

MyClass.generated.cs

(i Intellisense wprowadzi kod w MyClass.generated.cs) nawet wtedy, gdy w Eksplorator rozwiązań wszystkie foldery są sortowane jako pierwsze.

Pełny przykład:

A \ MyClass.gen3.cs

MyClass.gen2.cs

Z \ MyClass.gen1.cs

powinno być zamówienie "widziane" przez Intellisense, więc wprowadzi nowe klasy w A\MyClass.gen3.cs.

+0

Tak więc mówisz, że używa pełnej ścieżki ... Już się tego obawiałem: niektóre z moich generatorów (np. Mój generator kodu leksykora/generatora parsera) generują kompletny (podrzędny obszar nazw) hierarchie klas w jednym wygenerowanym pliku. Zasadniczo oznacza to, że bez względu na to, jak go nazwę, wygeneruje kod w niewłaściwym pliku. – atlaste

+0

@atlaste Zawsze jest plik 'z.z.z.zenerated.cs' :-) – xanatos

+0

Tak też myślałem o tym - problem polega na tym, że to rozwiązanie nie działa, jeśli zamawia bieżący folder" powyżej "podfolderów. Muszę to jednak spróbować. – atlaste