Частичные классы C #

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

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

В библиотеке классов:

namespace MyClassLibrary
{
    public partial class Book
    {
        public string Title { get; set; }
        public string AuthorLast { get; set; }
        public string AuthorFirst { get; set; }
        public string Publisher { get; set; }
        public string Edition { get; set; }
        public string ISBN10 { get; set; }
        public string ISBN13 { get; set; }
    }
}

В проекте (MyProject):

namespace MyClassLibrary
{
    public partial class Book
    {
        public string AdditionalProperty { get; set; }
    }
}

Я сослался на MyClassLibrary в MyProject (приложение формы Windows C #), однако, когда я пытаюсь использовать этот класс в коде для формы, я получаю следующую ошибку:

класс MyClassLibrary.Book

Предупреждение. Тип MyClassLibrary.Book в C: ... (Project) конфликтует с импортированным типом MyClassLibrary.Book в C: ... (DLL библиотеки классов). Используя тип, определенный в 'C: ... (проект)'.

Есть идеи, что я делаю неправильно, или весь мой подход плох, и я должен делать что-то еще?


person Andrew Keller    schedule 15.02.2010    source источник


Ответы (5)


Части не предназначены для составных сборок. Если вам нужно добавить в свой класс более конкретный тип использования, вы должны создать производный класс:

public class MyFoo
{
    public string BasicProperty {get;set;}
}

public class MySpecificFoo : MyFoo
{
    public string AnotherProperty {get;set;}
}

В вашем проекте, требующем более конкретного типа MyFoo, используйте вместо этого MySpecificFoo. Поскольку он наследуется / наследуется от MyFoo, он будет иметь все свойства и функциональные возможности MyFoo, а также дополнительные свойства. Это часть Полиморфизм < / a>, в этом и заключается настоящая сила ООП.

person Rex M    schedule 15.02.2010
comment
Благодарность! я попробую это с производным классом ... все еще новичок в этом! - person Andrew Keller; 15.02.2010
comment
эээ ... нет, это называется наследованием! - person Steven A. Lowe; 15.02.2010

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

Вот полное обсуждение SO по этому поводу: Если вы используете частичный класс в проекты?

person Nick Craver    schedule 15.02.2010
comment
Спасибо за быстрый ответ. У вас есть идеи, как мне лучше организовать занятия с учетом этой проблемы? Должен ли я просто дублировать их в проектах или просто добавить свойство к классу в библиотеке классов, даже если это только для одного проекта? Изменить: я собираюсь попробовать производные классы, как предложено ниже. еще раз спасибо - person Andrew Keller; 15.02.2010
comment
Я бы пошел с ответом Рекса для решения, наследование классов кажется лучшим подходом ... если нет причины, по которой вы не можете, если да, то какое дополнительное ограничение есть? - person Nick Craver; 15.02.2010
comment
Из Skeet по связанному вопросу: You can't write a partial class across projects. A partial class is a compile-time-only piece of syntactic sugar - the whole type ends up in a single assembly, i.e. one project. - person ruffin; 04.02.2016

Вместо этого вам следует попробовать использовать базовые классы и наследование. Или даже лучше состав объекта.

person Dan Herbert    schedule 15.02.2010
comment
Судя по непосредственному описанию, композиция определенно не лучшее решение - person Steven A. Lowe; 15.02.2010
comment
@ Стивен Совершенно верно. Я просто считаю полезным указать на это, потому что многие новички узнают о наследовании, а затем попадают в затруднительное положение, используя его повсюду просто потому, что не знают ничего лучшего. - person Dan Herbert; 15.02.2010

Я думаю, это больше похоже на то, чего вы пытаетесь достичь.

Поместите все ваши общие классы в проект библиотеки классов и скомпилируйте его в DLL.

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

person Chris Marisic    schedule 15.02.2010

все неправильно. Вместо этого вам следует рассмотреть частичные методы. Посмотри на них. Это именно то, о чем вы просили.

person No Refunds No Returns    schedule 15.02.2010