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

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

17 голосов
/ 15 февраля 2010

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

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

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

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 (приложение для формы C # windows), однако, когда я пытаюсь использовать этот класс в коде для формы, я получаю следующую ошибку:

класс MyClassLibrary.Book

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

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

Ответы [ 5 ]

21 голосов
/ 15 февраля 2010

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

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

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

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

9 голосов
/ 15 февраля 2010

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

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

1 голос
/ 15 февраля 2010

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

0 голосов
/ 15 февраля 2010

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

0 голосов
/ 15 февраля 2010

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

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

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

...