2010-10-04 3 views
126

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

+0

как и другие говорили, что это невозможно, но есть способы дополнить классы новым поведением из разных источников, что именно вы хотите делать в разных DLL? – Ozan

+0

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

ответ

191

От MSDN -Partial Classes and Methods:

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

10

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

30

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

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

3

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

+5

IMHO Есть допустимые случаи, например: Возможно, вы захотите добавить аннотации формы MVC к классу модели, определенному в другой сборке. Сама сборка не знает, в каком контексте она используется, поэтому класс в сборке не должен содержать никаких аннотаций. Они могут быть добавлены в частичном классе в контексте MVC, хотя (если это было возможно). – nyi

+3

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

4

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

1

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

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

Смежные вопросы