2010-02-15 63 views
16

我目前有一個解決方案,多個項目大多使用相同的類。因此,在我看來,在解決方案中添加一個包含這些類的類庫是一個不錯的主意,而不是在每個項目中重複該類。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; } 
    } 
} 

我在MyProject的參考MyClassLibrary(一個C#windows窗體應用程序),但是當我嘗試在表單的代碼隱藏中使用此類時,我收到以下錯誤:

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

局部模板是不是跨越組件。如果您需要添加到您的類更具體的類型的使用,你應該創建一個派生類:

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

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

在你的項目需要更具體的類型MyFoo的,利用MySpecificFoo代替。由於它從MyFoo繼承/派生,它將具有MyFoo的所有屬性和功能,並具有其他屬性。這是Polymorphism的一部分,這是OOP的真正威力所在。

+0

謝謝!我會用派生類來嘗試它...仍然是新的! – Andrew 2010-02-15 02:19:09

+2

呃......不,這叫做「繼承」! – 2010-02-15 02:58:07

+0

@Steven編輯清晰 – 2010-02-15 03:33:32

9

總之,不能使用跨項目的部分類。所有源代碼必須同時編譯,並且這是每個項目完成的。

下面是關於這對SO進行充分討論:Should you use a partial class across projects?

+0

感謝您的快速回答。你有什麼想法,我怎麼最好組織班級,然後給這個問題?我是否應該在項目中複製它們,或只是將屬性添加到類庫中的類中,即使它僅適用於一個項目? 編輯:我要去嘗試下面建議的派生類。再次感謝 – Andrew 2010-02-15 02:18:06

+1

我會和雷克斯的答案一起解決,繼承類似乎是最好的方法......除非有一個原因,你不能,如果是的話,還有什麼額外的限制? – 2010-02-15 02:20:29

+0

從[鏈接的問題上的Skeet](http://stackoverflow.com/a/309944/1028230):'你不能在項目中編寫分部類。一個部分類是編譯時只有一部分語法糖 - 整個類型最終在一個單獨的程序集中,即一個項目。「 – ruffin 2016-02-04 19:44:54

1

對於你要做的事情,你應該嘗試使用基類和繼承。或者甚至更好object composition

+0

從立即描述,組成絕對不是一個更好的解決方案 – 2010-02-15 03:07:32

+0

@Steven絕對。我發現指出是有幫助的,因爲許多新手學習繼承,然後在任何地方使用它,使自己陷入麻煩,只是因爲他們不知道更好。 – 2010-02-15 04:10:21

0

我認爲這更符合你想要達到的目標。

將所有常用類放入類庫項目中,並將其編譯爲DLL。

然後,您可以在外部項目中引用該DLL。無論何時您需要爲外部項目添加屬性,您都可以繼承該類並在其中添加屬性。

0

全部錯誤。您應該考慮部分方法。看看他們。他們正是你要求的。