我在共享项目中有一个静态类,我希望在另一个项目中使用更多方法进行扩展。因为我想扩展静态类的方法仅适用于第二个项目,并且还依赖于该不同项目中的其他类,我不能只将其移动到共享项目。
基本上我在MySolution.SharedProject中有X类。我想在MySolution.PrimaryProject中创建一个引用SharedProject的方法X.Get()。
我似乎无法在项目中执行部分,而且我也无法使用扩展方法扩展静态类。
我该怎么办?!
对于所有后来的访问者: 选择的答案符合我的要求,但更好的方式是Jon Skeet概述 - 选择不同的类名并将其完成。
答案 0 :(得分:16)
你做不到。类型只能存在于单个程序集中。 (这就是为什么部分类型不能在项目之间拆分的原因.CLR没有部分类型的概念 - 它们只是编译器魔术从多个文件编译单个类型。)
为什么不在第二个项目中创建新类型? “延伸”课程的好处在哪里?
编辑:听起来你应该有两个课程,例如:CommonValidation
和ProjectValidation
。很明显哪些方法属于哪一类...我真的不明白为什么会产生问题。
答案 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]