У меня в настоящее время есть решение с несколькими проектами, которые главным образом используют те же классы. В результате казалось мне, что это будет хорошая идея добавить библиотеку классов, содержащую эти классы в решении вместо того, чтобы повторить класс в каждом проекте.
Однако один проект, который я имею, требует нескольких дополнительных свойств к некоторым классам, которые характерны для того проекта и не будут использоваться больше нигде. В результате я думал, что должен использовать частичные классы для добавления этих свойств. Таким образом, я сделал что-то вроде этого:
В библиотеке классов:
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#), однако когда я пытаюсь использовать этот класс в codebehind для формы, я получаю следующую ошибку:
класс MyClassLibrary. Книга
Предупреждение: тип 'MyClassLibrary. Книга' в 'C:... (Проект)' конфликтует с импортированным типом 'MyClassLibrary. Книга' в 'C:... (DLL Библиотеки классов)'. Используя тип, определенный в 'C:... (проект)'.
Какая-либо идея, что я делаю неправильно или если мой целый подход плох и я должен делать что-то еще?
Части не предназначены для сборки сборок. Если вам нужно добавить в свой класс более конкретный тип использования, вы должны создать производный класс:
public class MyFoo
{
public string BasicProperty {get;set;}
}
public class MySpecificFoo : MyFoo
{
public string AnotherProperty {get;set;}
}
В вашем проекте, требующем более конкретного типа MyFoo, вместо этого используйте MySpecificFoo. Поскольку он наследуется / наследуется от MyFoo, он будет иметь все свойства и функциональные возможности MyFoo, а также дополнительные свойства. Это часть Полиморфизма , в которой заключается реальная сила ООП.
все неправильно. Вместо этого вам следует рассмотреть частичные методы. Посмотри на них. Это именно то, о чем вы просили.
Вместо того, что вы пытаетесь сделать, вам следует попробовать использовать базовые классы и наследование. Или даже лучше объектная композиция .
Я думаю, что это больше похоже на то, что вы пытаюсь достичь.
Поместите все ваши общие классы в проект библиотеки классов и скомпилируйте его в DLL.
Затем вы можете ссылаться на эту DLL во внешних проектах. Каждый раз, когда вам нужно добавить к нему свойство для внешнего проекта, вы можете унаследовать класс и добавить туда свойство.
Короче говоря, вы не можете использовать частичные классы в проектах . Все исходники должны компилироваться одновременно, и это делается для каждого проекта.
Вот полное обсуждение этого вопроса: Следует ли использовать частичный класс в проектах?