Teilklassen in separaten DLLs

154

Ist es möglich, eine Teilklasse in separaten DLLs mit zwei Teilen (gleicher Namespace, gleicher Klassenname) zu versehen?

Brad
quelle
Wie die anderen sagten, ist es nicht möglich, aber es gibt Möglichkeiten, Klassen durch neues Verhalten aus verschiedenen Quellen zu ergänzen. Was genau möchten Sie in verschiedenen DLLs tun?
Ozan
In meinem Fall möchte ich einer Klasse, die in einer Bibliothek eines Drittanbieters definiert ist, einige statische Methoden hinzufügen. Erweiterungsmethoden funktionieren nicht und Schnittstellen und Vererbung auch nicht, da die Klasse statisch ist. Nachdem ich festgestellt hatte, dass Sie teilweise statische Klassen haben können, kam ich hierher, um herauszufinden, ob es über Baugruppen hinweg funktioniert, aber leider sieht es so aus, als würde dies auch nicht funktionieren.
Ben

Antworten:

232

Aus MSDN - Teilklassen und Methoden :

Alle Teiltypdefinitionen, die Teile desselben Typs sein sollen, müssen in derselben Assembly und demselben Modul (EXE- oder DLL-Datei) definiert werden. Teildefinitionen können nicht mehrere Module umfassen.

Justin Niessner
quelle
36

Nein. Teilklassen sind ein rein sprachliches Merkmal. Wenn eine Assembly kompiliert wird, werden die Dateien kombiniert, um den Typ zu erstellen. Es ist nicht möglich, die Dateien auf verschiedene Assemblys zu verteilen.

Je nachdem, was Sie tun möchten, können Sie möglicherweise Erweiterungsmethoden verwenden , um das zu erreichen, was Sie benötigen.

Adam Robinson
quelle
13

Nein, das ist nicht möglich. Wenn die Assembly kompiliert ist, muss die Klasse beendet werden.

Darin Dimitrov
quelle
8

Während andere Antworten das unangenehme "Nein" liefern, das jeder, der auf dieser Seite landet, nicht sehen oder hören wollte, war ich von einem anderen Gedanken beeindruckt, der hier noch nicht erwähnt wurde. Wenn Teilklassen über Baugruppen hinweg zulässig wären, würde man Zugriff auf private Mitglieder vorhandener Typen erhalten, die nicht von ihm geschrieben wurden, sodass er sie auf eine Weise manipulieren kann, die nicht vom ursprünglichen Autor beabsichtigt war, wodurch die Funktionalität aller ererbenden Klassen gefährdet wird auch.

Nicht nur das, diese Klassen in anderen Versammlungen (und ihren Kindern) müssten neu kompiliert werden, damit es funktioniert. Daher ist es logischerweise nicht möglich, eine Klasse auf verschiedene Assemblys aufzuteilen.

Punkt net
quelle
Man kann sich leicht mit privaten Mitgliedern durch Reflexion anlegen, wenn es wirklich nötig ist. Es ist nicht möglich, eine Klasse zwischen Assemblys aufzuteilen, da Zirkelverweise nicht zulässig sind und benötigt werden, damit verschiedene Teile der Klasse interagieren können.
Zar Shardan
6

Sie können Erweiterungsmethoden verwenden, wenn Sie einer Klasse in einer anderen DLL eine Methode hinzufügen möchten. Der einzige Nachteil dieser Methode ist, dass Sie keine statischen Methoden hinzufügen können.

Thumbmunkeys
quelle
3

Die Frage ist, warum Sie eine Teilklasse in einer anderen Assembly erstellen möchten. Sie können abstrakte Klassen und Schnittstellen über Assemblys hinweg definieren. Möglicherweise müssen Sie dies untersuchen.

Gleno
quelle
10
IMHO gibt es gültige Fälle, zum Beispiel: Möglicherweise möchten Sie einer in einer anderen Assembly definierten Modellklasse MVC-Formularanmerkungen hinzufügen. Die Assembly selbst weiß nicht, in welchem ​​Kontext sie verwendet wird, daher sollte die Klasse in der Assembly keine Anmerkungen enthalten. Sie könnten jedoch in einer Teilklasse im MVC-Kontext hinzugefügt werden (wenn dies möglich wäre).
Nyi
3
nyi, warum nicht einfach von dieser Klasse erben und deine Attribute oben deklarieren? Sie können es sogar den gleichen Namen nennen, wenn Sie es vorziehen.
Gleno
0

Sie möchten wahrscheinlich nur eine Wrapper-Klasse in Ihrer eigenen Bibliothek erstellen, um die Klasse in der Bibliothek des 3. Teils herum. Fügen Sie dann der Wrapper-Klasse die gewünschten Funktionen hinzu.

Joakim Kungsman
quelle