Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:跨项目扩展静态类_C#_.net - Fatal编程技术网

C#:跨项目扩展静态类

C#:跨项目扩展静态类,c#,.net,C#,.net,我在一个共享项目中有一个静态类,我想在另一个项目中用进一步的方法扩展它。因为我想要扩展静态类的方法只适用于第二个项目,并且还依赖于不同项目中的其他类,所以我不能将其移动到共享项目中 基本上我在MySolution.SharedProject中有X类。我想在MySolution.PrimaryProject中创建一个方法X.Get(),该方法引用SharedProject 似乎我不能跨项目执行部分,也不能使用扩展方法扩展静态类 我该怎么做 对于所有后来的访客: 选择的答案符合我的要求,但更好的方法

我在一个共享项目中有一个静态类,我想在另一个项目中用进一步的方法扩展它。因为我想要扩展静态类的方法只适用于第二个项目,并且还依赖于不同项目中的其他类,所以我不能将其移动到共享项目中

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

似乎我不能跨项目执行部分,也不能使用扩展方法扩展静态类

我该怎么做

对于所有后来的访客:
选择的答案符合我的要求,但更好的方法是Jon Skeet概述的方法-选择不同的类名并完成它。你不能。类型只能存在于单个程序集中。(这就是为什么不能在项目之间拆分部分类型。CLR没有部分类型的概念-它们只是从多个文件编译单个类型的编译器魔法。)

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


编辑:听起来你应该有两个类,例如
CommonValidation
ProjectValidation
。应该很清楚哪些方法属于哪个类。。。我真的不明白为什么会产生问题。

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

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
时,您将能够看到这两种方法。当然,这些类实际上会在不同的文件中,实际上,在不同的项目中

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

我知道,每次提出名称都有点烦人,而且不同名称空间中的标识类名称也有点不切实际。如果您的名称空间很长,那么使用
指令在本地为它们添加别名可能会有所帮助

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

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

听起来您只是希望其中一些方法是
内部的

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

    internal static void AvailableForThisAssemblyOnly() {...}
}
如果我误解了,那么其他选项包括:

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

因为分类学。如果我继续为同一件事发明不同的名称,我会慢慢扼杀代码的可维护性。F*!!!但是,如果一个类只适用于第二个项目,而第一个项目更通用,那么这显然不是一回事-p除此之外;在我看来,它(根据定义)不是“同一件事”。我所说的类处理值验证。但是,它们部分是可配置的,但配置对象在共享项目中不可用,仅在主项目中可用。因此,这些方法应该只在主项目中可见,但我仍然希望将其余方法作为共享库的一部分重新使用。Jon&Marc,你说得对。Thorarin的方法是我最初要求的,但我现在只使用两个不同的类名。谢谢你叫我起床!(将信息添加到原始问题中)不,还有依赖性问题。由于共享对象需要驻留在我的共享项目中,而不是主项目中,因此我不能在不引起循环引用的情况下将任何依赖于主对象的内容放入其中;有点不清楚“主要”对象是这个dll还是调用方。但我的观点是界面仍然存在。此外,许多“循环参考”问题可以通过IoC等避免。感谢您帮助我解决这个问题!对我来说,这听起来像是一个混乱的配方,也是对继承的滥用。我自己只会使用两个不同的类名,但“耸耸肩”。我认为滥用听起来有点太苛刻了,相反,这是一个解决静态类无法继承的恼人限制的方法。但是现在你让我对这种做法有点不确定了,乔恩。也许我被一些不正确的事情缠住了。我把你的答案标记为正确的,因为它符合我最初想要的。不过,我现在将实际返回并使用两个不同的类名。我认为乔恩&你说得对,否则你会感到困惑。@Thorarin:这是对继承的滥用,因为这里没有专门化,这就是继承的目的。事实上,这些自然是静态类,它们被设置为非静态只是为了允许继承,这非常清楚地表明继承出了问题。