C#:跨项目扩展静态类

时间:2009-08-09 07:40:44

标签: c# .net

我在共享项目中有一个静态类,我希望在另一个项目中使用更多方法进行扩展。因为我想扩展静态类的方法仅适用于第二个项目,并且还依赖于该不同项目中的其他类,我不能只将其移动到共享项目。

基本上我在MySolution.SharedProject中有X类。我想在MySolution.PrimaryProject中创建一个引用SharedProject的方法X.Get()。

我似乎无法在项目中执行部分,而且我也无法使用扩展方法扩展静态类。

我该怎么办?!

对于所有后来的访问者: 选择的答案符合我的要求,但更好的方式是Jon Skeet概述 - 选择不同的类名并将其完成。

3 个答案:

答案 0 :(得分:16)

你做不到。类型只能存在于单个程序集中。 (这就是为什么部分类型不能在项目之间拆分的原因.CLR没有部分类型的概念 - 它们只是编译器魔术从多个文件编译单个类型。)

为什么不在第二个项目中创建新类型? “延伸”课程的好处在哪里?

编辑:听起来你应该有两个课程,例如: CommonValidationProjectValidation。很明显哪些方法属于哪一类...我真的不明白为什么会产生问题。

答案 1 :(得分:4)

您不能使用部分类。你可以使用继承,但是你不允许你创建类static,所以只需要将它的所有方法都设置为静态。然后通过使其构造函数受到保护来防止实例化:

namespace SharedProject
{
    public class X
    {
        protected X() { }
        public static void SharedMethod() { }
    }
}

namespace PrimaryProject
{
    public class X : SharedProject.X
    {
        protected X() { }
        public static void ProjectMethod() { }
    }
}

使用PrimaryProject.X时,您将能够看到这两种方法。当然,这些类实际上是在不同的文件中,实际上是在不同的项目中。

正如乔恩指出的那样,这可能会让人感到有些困惑。就个人而言,我只会使用两个不同的类名而不是继承。

我知道,每次提出名字都有点烦人,不同命名空间中的标识类名称也有点不切实际。如果您的命名空间非常长,那么使用using指令将它们置于本地别名可能会有所帮助。

答案 2 :(得分:2)

  

但是配置对象在共享项目中不可用,只在主要项目

中可用      

因此,这些方法只应在主项目中可见,但我仍然希望将其余方法重新用作共享库的一部分。

听起来你只想要一些方法internal

public static class Foo
{
    public static void AvailableAnywhere() {...}

    internal static void AvailableForThisAssemblyOnly() {...}
}

如果我误解了,那么其他选项包括:

  • 使用接口来描述配置选项(因此在辅助项目中没有具体类型)
  • 使用[InternalsVisibleTo]