Teilklassen in separaten DLLs


154

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


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.


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.


13

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


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.


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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.