Częściowe klasy w oddzielnych bibliotekach dll

154

Czy można mieć dwie części (tę samą przestrzeń nazw, tę samą nazwę klasy) częściowej klasy w oddzielnych bibliotekach DLL?

Ćwiek
źródło
tak jak inni mówili, że nie jest to możliwe, ale istnieją sposoby na uzupełnienie klas o nowe zachowanie z różnych źródeł, co dokładnie chcesz zrobić w różnych bibliotekach dll?
Ozan
W moim przypadku chcę dodać kilka metod statycznych do klasy zdefiniowanej w bibliotece innej firmy. Metody rozszerzające nie będą działać, podobnie jak interfejsy i dziedziczenie, ponieważ klasa jest statyczna. Po odkryciu, że możesz mieć częściowe klasy statyczne, przyszedłem tutaj, aby dowiedzieć się, czy działa w zespołach, ale niestety wygląda na to, że to też nie zadziała.
Ben

Odpowiedzi:

232

Z MSDN - częściowe klasy i metody :

Wszystkie definicje typu częściowego, które mają być częściami tego samego typu, muszą być zdefiniowane w tym samym zestawie i tym samym module (plik .exe lub .dll). Częściowe definicje nie mogą obejmować wielu modułów.

Justin Niessner
źródło
36

Nie. Klasy częściowe są cechą czysto językową. Gdy zestaw jest kompilowany, pliki są łączone w celu utworzenia typu. Nie jest możliwe rozłożenie plików na różne zespoły.

Jednak w zależności od tego, co chcesz zrobić, możesz użyć metod rozszerzających, aby osiągnąć to, czego potrzebujesz.

Adam Robinson
źródło
13

Nie, to niemożliwe. Po skompilowaniu zestawu klasa musi zostać zakończona.

Darin Dimitrov
źródło
8

Podczas gdy inne odpowiedzi dostarczają nieprzyjemnego „Nie”, którego nikt, kto wszedł na tę stronę, nie chciał widzieć ani słyszeć, uderzyła mnie inna myśl, o której jeszcze nie wspomniano. Gdyby częściowe klasy były dozwolone we wszystkich zespołach, można by uzyskać dostęp do prywatnych członków istniejących typów, które nie zostały przez niego napisane, co pozwoliłoby mu manipulować nimi w sposób, który nie był zamierzony przez pierwotnego autora, narażając w ten sposób funkcjonalność wszystkich dziedziczących klas też.

Co więcej, te klasy w innych zespołach (i ich dzieciach) musiałyby zostać ponownie skompilowane, aby działały. W związku z tym nie jest logicznie możliwe zezwolenie na podział klasy na różne zestawy.

dotNET
źródło
W razie potrzeby można łatwo zadzierać z prywatnymi członkami poprzez refleksję. Nie jest możliwe podzielenie klasy między zestawy, ponieważ odwołania cykliczne są niedozwolone i byłyby potrzebne do interakcji różnych części klasy.
Zar Shardan
6

Możesz użyć metod rozszerzających, jeśli chcesz dodać metodę do klasy w innej bibliotece dll. Jedyną wadą tej metody jest to, że nie można dodawać metod statycznych.

thumbmunkeys
źródło
3

Pytanie brzmi, dlaczego chcesz utworzyć częściową klasę w innym zestawie? Możesz zdefiniować abstrakcyjne klasy i interfejsy w zespołach, być może musisz się temu przyjrzeć.

Gleno
źródło
10
IMHO istnieją ważne przypadki, na przykład: Możesz chcieć dodać adnotacje formularza MVC do klasy modelu zdefiniowanej w innym zestawie. Sam zestaw nie wie, w jakim kontekście jest używany, więc klasa w zestawie nie powinna mieć żadnych adnotacji. Można je jednak dodać w klasie częściowej w kontekście MVC (gdyby było to możliwe).
nyi
3
nyi, dlaczego po prostu nie odziedziczyć po tej klasie i nie zadeklarować swoich atrybutów na wierzchu? Jeśli wolisz, możesz nawet nazwać to tą samą nazwą.
Gleno
0

Prawdopodobnie chcesz po prostu utworzyć klasę Wrapper w swojej własnej bibliotece, wokół klasy w bibliotece trzeciej części. Następnie dodaj dowolną funkcjonalność do klasy opakowania.

Joakim Kungsman
źródło