【问题标题】:C# Partial ClassesC# 部分类
【发布时间】:2010-02-15 02:14:58
【问题描述】:

我目前有一个包含多个项目的解决方案,这些项目大多使用相同的类。因此,在我看来,最好在解决方案中添加一个包含这些类的类库,而不是在每个项目中重复这些类。

但是,我拥有的一个项目需要一些附加属性来添加特定于该项目的一些类,并且不会在其他任何地方使用。结果,我认为我应该使用部分类来添加这些属性。所以我做了这样的事情:

在类库中:

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(一个 C# windows 窗体应用程序)中引用了 MyClassLibrary,但是当我尝试在窗体的代码隐藏中使用此类时,我收到以下错误:

类 MyClassLibrary.Book

警告:类型 'C:...中的'MyClassLibrary.Book' (Project)' 与导入的冲突 在“C:...”中键入“MyClassLibrary.Book” (类库 DLL)'。使用类型 在 'C:...(project)' 中定义。

知道我做错了什么,或者我的整个方法很糟糕,我应该做点别的吗?

【问题讨论】:

    标签: c# class partial-classes


    【解决方案1】:

    Partials 不适用于跨越程序集。如果您需要添加到您的类以获得更具体的使用类型,您应该创建一个派生类:

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

    在需要更具体类型的 MyFoo 的项目中,请改用 MySpecificFoo。由于它继承/派生自 MyFoo,它将具有 MyFoo 的所有属性和功能,以及其他属性。这是Polymorphism 的一部分,这就是OOP 的真正威力所在。

    【讨论】:

    • 谢谢!我会用派生类来试试……这方面还是新的!
    • 呃……不,这叫“继承”!
    【解决方案2】:

    简而言之,您不能跨项目使用部分类。必须同时编译所有源代码,并且每个项目都这样做。

    这是关于 SO 的完整讨论:Should you use a partial class across projects?

    【讨论】:

    • 感谢您的快速回答。考虑到这个问题,你有什么想法可以最好地组织课程吗?我应该只是在项目中复制它们还是只是将属性添加到类库中的类中,即使它只用于一个项目?编辑:我将尝试如下建议的派生类。再次感谢
    • 我会选择 Rex 的解决方案,继承类似乎是最好的方法......除非有理由你不能,如果是这样,还有什么额外的限制?
    • 来自Skeet on that linked question: You can't write a partial class across projects. A partial class is a compile-time-only piece of syntactic sugar - the whole type ends up in a single assembly, i.e. one project.
    【解决方案3】:

    对于您想要做的事情,您应该尝试使用基类和继承。或者更好object composition

    【讨论】:

    • 从直接描述来看,组合肯定不是更好的解决方案
    • @Steven 绝对是。我只是发现指出这一点很有帮助,因为许多新手学习了继承,然后无处不在使用它而陷入困境,仅仅是因为他们不知道更好。
    【解决方案4】:

    我认为这更符合您想要实现的目标。

    将所有常用类放入类库项目中,并将其编译为 DLL。

    然后您可以在外部项目中引用该 DLL。每当您需要为外部项目添加属性时,您都可以继承该类并在那里添加属性。

    【讨论】:

      【解决方案5】:

      都错了。您应该考虑使用部分方法。看看他们。它们正是您所要求的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        • 1970-01-01
        • 2010-09-13
        相关资源
        最近更新 更多