2010-02-15 3 views
16

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

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

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

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

class MyClassLibrary.Book

Warning: The type 'MyClassLibrary.Book' in 'C:... (Project)' conflicts with the imported type 'MyClassLibrary.Book' in 'C:... (Class Library DLL)'. Using the type defined in 'C:...(project)'.

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

ответ

20

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

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

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

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

+0

спасибо! я попробую это с производным классом ... все еще нова в этом! – Andrew

+2

Ух ... нет, это называется «наследство»! –

+0

@Steven отредактировал для ясности –

9

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

Вот полное обсуждение на SO об этом: Should you use a partial class across projects?

+0

Спасибо за быстрый ответ. Есть ли у вас какие-либо идеи о том, как я могу лучше всего организовать классы, а затем эту проблему? Должен ли я просто дублировать их в проектах или просто добавлять свойство к классу в библиотеке классов, даже если он предназначен только для одного проекта? Редактирование: собираюсь попробовать производные классы, как предложено ниже. Еще раз спасибо – Andrew

+1

Я бы пошел с ответом Рекса на решение, наследуя классы, кажется, лучший подход ... если нет причин, по которым вы не можете, если да, то какое дополнительное ограничение существует? –

+0

Из [Скита на этот связанный вопрос] (http://stackoverflow.com/a/309944/1028230): 'Вы не можете написать частичный класс для всех проектов. Частичный класс - это кусок синтаксического сахара только для компиляции - весь тип заканчивается в одной сборке, то есть в одном проекте. « – ruffin

1

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

+0

с самого быстрого описания, состав, безусловно, не лучшее решение –

+0

@Steven Абсолютно. Я просто считаю, что полезно отметить, потому что многие новички узнают о наследовании, а затем попадают в неприятности, используя его ** везде ** просто потому, что они не знают ничего лучшего. –

0

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

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

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

0

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