Classes parciais em DLLs separadas

154

É possível ter duas partes (mesmo espaço para nome, mesmo nome de classe) em uma classe parcial em DLLs separadas?

Brad
fonte
Como os outros disseram que não é possível, mas existem maneiras de complementar as classes com um novo comportamento de diferentes fontes. O que exatamente você quer fazer em diferentes DLLs?
Ozan
No meu caso, quero adicionar alguns métodos estáticos a uma classe definida em uma biblioteca de terceiros. Os métodos de extensão não funcionam e nem interfaces e herança, porque a classe é estática. Depois de descobrir que você pode ter classes estáticas parciais, vim aqui para descobrir se funciona em assemblies, mas, infelizmente, parece que isso também não funcionará.
Ben

Respostas:

232

Do MSDN - Classes e métodos parciais :

Todas as definições de tipo parcial destinadas a serem partes do mesmo tipo devem ser definidas no mesmo assembly e no mesmo módulo (arquivo .exe ou .dll). Definições parciais não podem abranger vários módulos.

Justin Niessner
fonte
36

Não. Classes parciais são um recurso puramente de linguagem. Quando uma montagem é compilada, os arquivos são combinados para criar o tipo. Não é possível espalhar os arquivos em diferentes montagens.

Porém, dependendo do que você deseja fazer, você poderá usar métodos de extensão para realizar o que precisa.

Adam Robinson
fonte
13

Não, não é possível. Quando a montagem é compilada, a classe precisa ser concluída.

Darin Dimitrov
fonte
8

Enquanto outras respostas fornecem o desagradável "Não" que qualquer pessoa que chegue a esta página não quer ver ou ouvir, fiquei impressionado com outro pensamento que ainda não foi mencionado aqui. Se classes parciais fossem permitidas em assemblies, seria possível acessar membros particulares de tipos existentes que não foram escritos por ele, permitindo-lhe manipulá-los de maneiras que não eram pretendidas pelo autor original, comprometendo assim a funcionalidade de todas as classes herdadas também.

Além disso, essas classes em outras assembléias (e seus filhos) precisariam ser recompiladas para que funcionasse. Portanto, logicamente não é possível permitir a divisão de uma classe em diferentes montagens.

ponto Net
fonte
Pode-se facilmente mexer com membros privados através de reflexão, se realmente necessário. Não é possível dividir uma classe entre montagens porque as referências circulares não são permitidas e seriam necessárias para que diferentes partes da classe interajam.
Zar Shardan
6

Você pode usar métodos de extensão quando desejar adicionar um método a uma classe em uma dll diferente. A única desvantagem deste método é que você não pode adicionar métodos estáticos.

thumbmunkeys
fonte
3

A questão é por que você deseja criar uma classe parcial em outra montagem? Você pode definir classes e interfaces abstratas entre os assemblies, talvez seja necessário analisar isso.

Gleno
fonte
10
IMHO, existem casos válidos, por exemplo: Você pode querer adicionar anotações de formulário MVC a uma classe de modelo definida em uma montagem diferente. A montagem em si não sabe em que contexto é usada; portanto, a classe na montagem não deve ter anotações. Eles poderiam ser adicionados em uma classe parcial no contexto do MVC (se possível).
nyi
3
nyi, por que não apenas herdar dessa classe e declarar seus atributos no topo? Você pode até chamar o mesmo nome, se preferir.
Gleno 28/03
0

Você provavelmente só deseja criar uma classe Wrapper dentro da sua própria biblioteca, em torno da classe na biblioteca da 3ª parte. Em seguida, adicione qualquer funcionalidade à classe de wrapper.

Joakim Kungsman
fonte