Classi parziali in DLL separate


154

È possibile avere due parti (stesso spazio dei nomi, stesso nome di classe) in una classe parziale in DLL separate?


come gli altri hanno detto che non è possibile, ma ci sono modi per integrare le classi con nuovi comportamenti da fonti diverse, cosa vuoi fare esattamente in diverse DLL?
Ozan,

Nel mio caso, voglio aggiungere un paio di metodi statici a una classe definita in una libreria di terze parti. I metodi di estensione non funzioneranno e nemmeno le interfacce e l'ereditarietà, poiché la classe è statica. Dopo aver scoperto che è possibile avere classi statiche parziali, sono venuto qui per scoprire se funziona su tutti gli assiemi ma purtroppo sembra che neanche questo funzioni.
Ben

Risposte:


232

Da MSDN - Classi e metodi iniziali :

Tutte le definizioni di tipo parziale intese come parti dello stesso tipo devono essere definite nello stesso assembly e nello stesso modulo (file .exe o .dll). Le definizioni parziali non possono estendersi su più moduli.


36

No. Le lezioni parziali sono una caratteristica puramente linguistica. Quando viene compilato un assembly, i file vengono combinati per creare il tipo. Non è possibile distribuire i file in diversi assiemi.

A seconda di ciò che vuoi fare, tuttavia, potresti essere in grado di utilizzare i metodi di estensione per ottenere ciò di cui hai bisogno.


13

No non è possibile. Quando l'assembly viene compilato, la classe deve essere terminata.


8

Mentre altre risposte forniscono il "no" spiacevole che nessuno atterrando su questa pagina non voleva vedere o sentire, sono stato colpito da un altro pensiero che non è stato ancora menzionato qui. Se le classi parziali fossero consentite in tutti gli assiemi, si otterrebbe l'accesso a membri privati ​​di tipi esistenti che non sono stati scritti da lui, permettendogli così di manipolarli in modi che non erano previsti dall'autore originale, compromettendo così la funzionalità di tutte le classi ereditarie pure.

Non solo, quelle classi in altre assemblee (e i loro figli) dovrebbero essere ricompilate per farlo funzionare. Pertanto non è logicamente possibile consentire la suddivisione di una classe su assiemi diversi.


Si può facilmente scherzare con i membri privati ​​tramite la riflessione se veramente necessario. Non è possibile dividere una classe tra assiemi perché i riferimenti circolari non sono consentiti e sarebbero necessari affinché le diverse parti della classe possano interagire.
Zar Shardan,

6

È possibile utilizzare i metodi di estensione quando si desidera aggiungere un metodo a una classe in una diversa DLL. L'unico inconveniente di questo metodo è che non puoi aggiungere metodi statici.


3

La domanda è: perché vorresti creare una classe parziale in un altro assembly? È possibile definire classi e interfacce astratte tra assiemi, forse è necessario esaminarlo.


10
IMHO ci sono casi validi, ad esempio: potresti voler aggiungere annotazioni di moduli MVC a una classe di modello definita in un assieme diverso. L'assembly stesso non sa in quale contesto viene utilizzato, quindi la classe nell'assembly non dovrebbe avere annotazioni. Tuttavia potrebbero essere aggiunti in una classe parziale nel contesto MVC (se fosse possibile).
nyi,

3
nyi, perché non ereditare da quella classe e dichiarare i tuoi attributi in cima? Puoi anche chiamarlo con lo stesso nome, se preferisci.
Gleno,

0

Probabilmente vuoi solo creare una classe Wrapper nella tua libreria, attorno alla classe nella libreria della terza parte. Quindi aggiungere qualsiasi funzionalità alla classe wrapper.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.