Частичные занятия в отдельных библиотеках

154

Можно ли иметь две части (одно и то же пространство имен, одно и то же имя класса) в частичном классе в отдельных DLL?

штифтик
источник
как и другие говорили, что это невозможно, но есть способы дополнить классы новым поведением из разных источников, что именно вы хотите делать в разных библиотеках?
Озан
В моем случае я хочу добавить пару статических методов в класс, определенный в сторонней библиотеке. Методы расширения не будут работать, равно как и интерфейсы и наследование, потому что класс является статическим. Обнаружив, что у вас могут быть частичные статические классы, я пришел сюда, чтобы выяснить, работает ли он между сборками, но, увы, похоже, что это тоже не сработает.
Бен

Ответы:

232

Из MSDN - Частичные классы и методы :

Все определения частичного типа, которые должны быть частями одного и того же типа, должны быть определены в одной сборке и в одном и том же модуле (файл .exe или .dll). Частичные определения не могут охватывать несколько модулей.

Джастин Нисснер
источник
36

Частичные занятия - это чисто языковая особенность. Когда сборка компилируется, файлы объединяются для создания типа. Невозможно распределить файлы по разным сборкам.

В зависимости от того, что вы хотите сделать, вы можете использовать методы расширения, чтобы выполнить то, что вам нужно.

Адам Робинсон
источник
13

Нет, это невозможно. Когда сборка скомпилирована, класс должен быть закончен.

Дарин димитров
источник
8

В то время как другие ответы дают неприятное «Нет», что любой, кто заходил на эту страницу, не хотел видеть или слышать, я был поражен другой мыслью, которая еще не упоминалась здесь. Если бы частичные классы были разрешены для разных сборок, можно было бы получить доступ к закрытым членам существующих типов, которые не были им написаны, что позволило бы ему манипулировать ими способами, которые не были предназначены первоначальным автором, что поставило под угрозу функциональность всех наследующих классов слишком.

Мало того, эти классы в других сборках (и их дочерние элементы) необходимо будет перекомпилировать, чтобы это работало. Таким образом, логически невозможно разрешить разбиение класса на разные сборки.

Dotnet
источник
Можно легко связываться с частными членами через рефлексию, если это действительно необходимо. Невозможно разделить класс между сборками, потому что циклические ссылки не разрешены, и они были бы необходимы для взаимодействия различных частей класса.
Зар
6

Вы можете использовать методы расширения, когда хотите добавить метод в класс в другой DLL. Недостатком этого метода является то, что вы не можете добавлять статические методы.

оборота большого пальца руки
источник
3

Вопрос в том, почему вы хотите создать частичный класс в другой сборке? Вы можете определять абстрактные классы и интерфейсы для разных сборок, возможно, вам нужно разобраться с этим.

Глено
источник
10
IMHO, есть допустимые случаи, например: Вы можете добавить аннотации форм MVC к классу модели, определенному в другой сборке. Сама сборка не знает, в каком контексте она используется, поэтому класс в сборке не должен иметь никаких аннотаций. Они могут быть добавлены в частичный класс в контексте MVC, хотя (если бы это было возможно).
Ньи
3
nyi, почему бы просто не наследовать от этого класса и объявить ваши атрибуты сверху? Вы можете даже назвать его тем же именем, если хотите.
Глено
0

Вы, вероятно, просто хотите создать класс Wrapper в своей собственной библиотеке, вокруг класса в библиотеке 3-ей части. Затем добавьте любую функциональность в класс-оболочку.

Йоаким Кунгсман
источник