2010-02-15 61 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

全部错误。您应该考虑部分方法。看看他们。他们正是你要求的。